JTable如何像excel一样固定行列,不随滚动条移动

来源:互联网 发布:时尚界的凯撒大帝知乎 编辑:程序博客网 时间:2024/05/17 19:19

转自:http://bbs.csdn.net/topics/200068425


JTable如何像excel一样固定行列,不随滚动条移动

我把代码贴出来给大家共享一下吧,也许有谁用得着的
只是还有一点不够完美,大家运行一下看效果,在最下面一行,固定列和非固定列没对齐
原因是固定列的footer边框稍大一些造成的,谁能把这个问题解决了也行啊,不想把分就这么扔掉了
附代码,jdk1.6下通过
Java code?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
public class TestFixTable extends JFrame {
    private static final long serialVersionUID = 1L;
 
    Object[][] data;
 
    Object[] column;
 
    JTable fixedTable, table;
 
    public TestFixTable() {
        super("Fixed Column Example");
        setSize(400150);
 
        data = new Object[][] { { "1""11""A""""""""""" },
                "2""22""""B""""""""" },
                "3""33""""""C""""""" },
                "4""44""""""""D""""" },
                "5""55""""""""""E""" },
                "6""66""""""""""""F" } };
        column = new Object[] { "fixed 1""o""a""b""c""d""e""f" };
 
        AbstractTableModel fixedModel = new AbstractTableModel() {
            private static final long serialVersionUID = 1L;
 
            public int getColumnCount() {
                return 1;
            }
 
            public int getRowCount() {
                return data.length;
            }
 
            public String getColumnName(int col) {
                return (String) column[col];
            }
 
            public Object getValueAt(int row, int col) {
                return data[row][col];
            }
        };
        AbstractTableModel model = new AbstractTableModel() {
            private static final long serialVersionUID = 1L;
 
            public int getColumnCount() {
                return column.length - 2;
            }
 
            public int getRowCount() {
                return data.length;
            }
 
            public String getColumnName(int col) {
                return (String) column[col + 1];
            }
 
            public Object getValueAt(int row, int col) {
                return data[row][col + 1];
            }
 
            public void setValueAt(Object obj, int row, int col) {
                data[row][col + 1] = obj;
            }
 
            public boolean CellEditable(int row, int col) {
                return true;
            }
        };
 
        fixedTable = new JTable(fixedModel);
        fixedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        fixedTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        fixedTable.getSelectionModel().addListSelectionListener(
                new ListSelectionListener() {
                    public void valueChanged(ListSelectionEvent arg0) {
                        checkSelection(true);
 
                    }
                });
 
        table = new JTable(model);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        table.getSelectionModel().addListSelectionListener(
                new ListSelectionListener() {
                    public void valueChanged(ListSelectionEvent arg0) {
                        checkSelection(false);
                    }
                });
 
        JViewport viewport = new JViewport();
        viewport.setView(fixedTable);
        viewport.setPreferredSize(fixedTable.getPreferredSize());
 
        JScrollPane scroll = new JScrollPane(table);
        scroll.setRowHeaderView(viewport);
        scroll.setCorner(JScrollPane.UPPER_LEFT_CORNER, fixedTable
                .getTableHeader());
 
        getContentPane().add(scroll, BorderLayout.CENTER);
    }
 
    private void checkSelection(boolean isFixedTable) {
        int fixedSelectedIndex = fixedTable.getSelectedRow();
        int selectedIndex = table.getSelectedRow();
        if (fixedSelectedIndex != selectedIndex) {
            if (isFixedTable) {
                table.setRowSelectionInterval(fixedSelectedIndex,
                        fixedSelectedIndex);
            else {
                fixedTable
                        .setRowSelectionInterval(selectedIndex, selectedIndex);
            }
        }
 
    }
 
    public static void main(String[] args) {
        TestFixTable frame = new TestFixTable();
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        frame.setVisible(true);
    }
}


固定列是行表头的思想,即将所有行的前几列固定,比较好的做法是采用两个表,与楼主列的资料类似。

Java code?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
     
public static JScrollPane createAJScrollPane(JTable sideTb,int sideViewWidth,JTable Tb){
   JScrollPane result = new JScrollPane(Tb);
 
   JViewport dataviewport = new JViewport();
 
   result.getViewport().setBackground(Color.white);
   result.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
 
   //添加左边表格
   dataviewport.setView(sideTb);
   dataviewport.setBackground(Color.white);
   dataviewport.setPreferredSize(new Dimension(sideViewWidth, 100));
   result.setRowHeader(dataviewport);
   result.setCorner(JScrollPane.UPPER_LEFT_CORNER, sideTb.getTableHeader());
 
   return result;
}


固定行是多表头的思想,网上比较多的资料是重写UI的思想,可以搜索GroupableTableHeaderUI,但这种做法存在很多问题,例如导出,或多表头个别数据的修改。前两天看到了利用layout实现的方式,可以看看:http://topic.csdn.net/u/20080218/08/4d73d35f-af01-4914-b3a2-e2e2efb858c6.html



0 0
原创粉丝点击