【问题标题】:Re-Using JTableHeader重用 JTableHeader
【发布时间】:2015-05-02 15:45:41
【问题描述】:

下面的代码显示了 2 个 JTable。

因为它们都有我想要的完全相同的标题,为了提高效率,重用第一个表中的标题。

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

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

代码如下:

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();
}

任何建议将不胜感激

【问题讨论】:

  • “因为它们都将具有我想要的完全相同的标题,为了提高效率,......” 术语“过早优化”对您有什么意义吗?这是它的一个经典案例。
  • 哦,顺便说一句 - Java 组件只能出现在一个地方..
  • @Andrew Thompson。把你的观点重新“过早优化”。但是我想知道为什么会发生这种情况,因此发布了一个微不足道的问题

标签: java swing jtable jtableheader tableheader


【解决方案1】:

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

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

JTable firstTable = new JTable(theData, columnNames);

在您的 buildTheSecondTable 方法中,您可以访问列名数组,因此只需使用:

//DefaultTableModel thisTableModel = new DefaultTableModel();
DefaultTableModel thisTableModel = new DefaultTableModel(columnNames);

然后你可以向模型中添加数据,向表中添加模型。

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

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

【讨论】:

  • camickr,明白了。单身父母。非常感谢您的解释和解决方案。我已经勾选了这个答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多