JTable冻结列对齐问题

JTable冻结列对齐问题

本文介绍了JTable冻结列对齐问题(Java 1.6)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经实现了JTable的冻结列,当使用垂直滚动条滚动大型数据集时,冻结表中的列与主表不对齐.请帮忙

I have implemented JTable frozen columns as below.When scrolling on a large dataset using vertical scrollbar, the columns in the frozen table are not aligned with the main table.Please help

JTable      table,fixedTable
JScrollPane     _scrl_table;

table = new JTable();
table.setName("MAIN_TABLE");
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.setVisibleRowCount(8);


fixedTable = new JTable();
fixedTable.setName("FIXED_TABLE");
fixedTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

 _scrl_table = new JScrollPane(table,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

fixedTable.setPreferredScrollableViewportSize(fixedTable.getPreferredSize());
    _scrl_table.setRowHeaderView( fixedTable );
    _scrl_table.setCorner(JScrollPane.UPPER_LEFT_CORNER,         fixedTable.getTableHeader());

推荐答案

  • 也许没有理由使用两个JTables

    使用正确的 camickr的RowNumberTable RowHeader

    您可以共享AdjustmentListener,无论是否包含BoundedRangeModel

    you can to share AdjustmentListener, with or without BoundedRangeModel

    示例滚动水平方向,必须更改为垂直

    example scrolling horizontal directions, have to change to the vertical

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.table.*;
    
    
    public class FixedRowExample extends JFrame {
    
        private static final long serialVersionUID = 1L;
        private Object[][] data;
        private Object[] column;
        private JTable fixedTable, table;
        private int FIXED_NUM = 2;
    
        public FixedRowExample() {
            super("Fixed Row Example");
            data = new Object[][]{
                        {"a", "", "", "", "", ""},
                        {"", "b", "", "", "", ""},
                        {"", "", "c", "", "", ""},
                        {"", "", "", "d", "", ""},
                        {"", "", "", "", "e", ""},
                        {"", "", "", "", "", "f"},
                        {"fixed1", "", "", "", "", "", "", ""},
                        {"fixed2", "", "", "", "", "", "", ""}};
            column = new Object[]{"A", "B", "C", "D", "E", "F"};
            AbstractTableModel model = new AbstractTableModel() {
    
                private static final long serialVersionUID = 1L;
    
                @Override
                public int getColumnCount() {
                    return column.length;
                }
    
                @Override
                public int getRowCount() {
                    return data.length - FIXED_NUM;
                }
    
                @Override
                public String getColumnName(int col) {
                    return (String) column[col];
                }
    
                @Override
                public Object getValueAt(int row, int col) {
                    return data[row][col];
                }
    
                @Override
                public void setValueAt(Object obj, int row, int col) {
                    data[row][col] = obj;
                }
    
                public boolean CellEditable(int row, int col) {
                    return true;
                }
            };
    
            AbstractTableModel fixedModel = new AbstractTableModel() {
    
                private static final long serialVersionUID = 1L;
    
                @Override
                public int getColumnCount() {
                    return column.length;
                }
    
                @Override
                public int getRowCount() {
                    return FIXED_NUM;
                }
    
                @Override
                public Object getValueAt(int row, int col) {
                    return data[row + (data.length - FIXED_NUM)][col];
                }
            };
            table = new JTable(model);
            table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            fixedTable = new JTable(fixedModel);
            fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            fixedTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            JScrollPane scroll = new JScrollPane(table);
            scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
            JScrollPane fixedScroll = new JScrollPane(fixedTable) {
    
                private static final long serialVersionUID = 1L;
    
                @Override
                public void setColumnHeaderView(Component view) {
                } // work around
            }; // fixedScroll.setColumnHeader(null);
            fixedScroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
            JScrollBar bar = fixedScroll.getVerticalScrollBar();
            JScrollBar dummyBar = new JScrollBar() {
    
                private static final long serialVersionUID = 1L;
    
                @Override
                public void paint(Graphics g) {
                }
            };
            dummyBar.setPreferredSize(bar.getPreferredSize());
            fixedScroll.setVerticalScrollBar(dummyBar);
    
            final JScrollBar bar1 = scroll.getHorizontalScrollBar();
            JScrollBar bar2 = fixedScroll.getHorizontalScrollBar();
            bar2.addAdjustmentListener(new AdjustmentListener() {
    
                @Override
                public void adjustmentValueChanged(AdjustmentEvent e) {
                    bar1.setValue(e.getValue());
                }
            });
            scroll.setPreferredSize(new Dimension(400, 100));
            fixedScroll.setPreferredSize(new Dimension(400, 52));
            getContentPane().add(scroll, BorderLayout.CENTER);
            getContentPane().add(fixedScroll, BorderLayout.SOUTH);
        }
    
        public static void main(String[] args) {
            FixedRowExample frame = new FixedRowExample();
            frame.addWindowListener(new WindowAdapter() {
    
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
            frame.pack();
            frame.setVisible(true);
        }
    }
    

    这篇关于JTable冻结列对齐问题(Java 1.6)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-11 22:15