首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重用JTableHeader

重用JTableHeader
EN

Stack Overflow用户
提问于 2015-05-02 15:45:41
回答 1查看 52关注 0票数 1

下面的代码显示2 JTables。

由于它们都有完全相同的标题,为了提高效率,我希望重用第一个表中的标头。

但是,运行代码会导致头出现在第二个表中,而不是出现在最初来自的表中。

我对工作不太感兴趣--周旋,但为了学习和理解,我更感兴趣的是找出为什么标题没有出现在第一个表中。

以下是代码:

代码语言:javascript
复制
public class HeaderTest1 {

public void doTheTest() {
    JFrame testFrame = new JFrame("Header Test");
    JPanel pane = new JPanel();

    Container theContentPane = testFrame.getContentPane();

    BoxLayout box = new BoxLayout(pane, BoxLayout.Y_AXIS);
    pane.setLayout(box);
    theContentPane.add(pane);

    String theData[][]
            = {
                {"One", "two", "3"},
                {"four", "5", "six"},
                {"7", "8", "9.0"},
                {"£10.00", "11", "twelve"}
            };

    String columnNames[] = {"Column 1", "Column 2", "Column 3"};

    JTable firstTable = new JTable(theData, columnNames);

    JScrollPane thisScrollPane = new JScrollPane(firstTable);
    JTableHeader thisTableHeader = firstTable.getTableHeader();

    pane.add(thisScrollPane);

    buildTheSecondTable(thisTableHeader, firstTable, columnNames, pane);

    testFrame.pack();
    testFrame.setVisible(true);
}

private void buildTheSecondTable(JTableHeader headerFromTheFirstTable,
        JTable firstTable, String[] columnNames, JPanel pane) {

    JTable secondTable = new JTable();
    int columnCount = columnNames.length;

    JScrollPane thisScrollPane = new JScrollPane(secondTable);
    secondTable.setTableHeader(headerFromTheFirstTable);

    Object[][] emptyData = new Object[1][columnCount];
    for (int n = 0; n < columnCount; n++) {
        emptyData[0][n] = "";
    }
    DefaultTableModel thisTableModel = new DefaultTableModel();
    thisTableModel.setDataVector(emptyData, columnNames);
    secondTable.setModel(thisTableModel);
    secondTable.setLayout(firstTable.getLayout());
    secondTable.setCellEditor(firstTable.getCellEditor());
    pane.add(thisScrollPane);
}

public static void main(String[] args) throws SQLException, ParseException {
    HeaderTest thisTest = new HeaderTest();
    thisTest.doTheTest();
}

如有任何建议,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-02 16:10:50

Swing组件只能有一个父组件,因此不能共享表头组件。

但是,您可以共享列名数组:

代码语言:javascript
复制
JTable firstTable = new JTable(theData, columnNames);

buildTheSecondTable方法中,您可以访问列名数组,所以只需使用:

代码语言:javascript
复制
//DefaultTableModel thisTableModel = new DefaultTableModel();
DefaultTableModel thisTableModel = new DefaultTableModel(columnNames);

然后,可以将数据添加到模型中,并将模型添加到表中。

然后,在将模型添加到表后,重新排序代码以创建JScrollPane。

另外,去掉table.setLayout()代码。您永远不会在桌子上使用布局管理器。不向表中添加组件。该表不使用实际组件来呈现数据本身。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30004260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档