[英]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.