簡體   English   中英

重用JTableHeader

[英]Re-Using JTableHeader

下面的代碼顯示了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();
}

任何意見,將不勝感激

Swing組件只能有一個父組件,因此您無法共享表頭組件。

但是,您可以共享列名稱數組:

JTable firstTable = new JTable(theData, columnNames);

buildTheSecondTable方法中,您可以訪問列名數組,因此只需使用:

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

然后,您可以將數據添加到模型,將模型添加到表中。

然后在將模型添加到表后重新排序代碼以創建JScrollPane。

另外,擺脫table.setLayout()代碼。 您永遠不會在表格上使用布局管理器。 您不會向表中添加組件。 該表在不使用實際組件的情況下呈現數據本身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM