主窗口类(ExtendedJFrame
,用GUI编辑器构建)保存对JTable
对象的引用(让我们称它为table)。开始时是空的new JTable()
。并将其添加到JPanel
(让我们称之为jpanel1)中,该窗口也位于主窗口中。
用户现在从菜单中选择他想要做的事情--比如创建新的表格,编辑表格中的颜色等等。如果他选择创建新表,那么特定的扩展customJPanel1) (让我们称它为JPanel
)显示了选项。customJPanel1从主窗口接收对表的引用。这是我们要处理的桌子。
现在,用户已经为不同的JTable
构造函数显示了不同的选项。他选择一个,填写一些信息,然后按下按钮。之后,根据他选择的内容,创建了新的JTable
。
例如,如果他选择空构造函数,就会发生这样的情况:table=new JTable()
in customJPanel1。正如您所知道的,您不能在显示组件时对swing组件执行此操作。所以我就这么做:
JPanel panel=(JPanel) table.getParent().getParent().getParent() // this is to get reference to jPanel1 which is holding this table.
panel.removeAll() //this is to remove old table from panel
table=new JTable(); //this is to create new table according to what user choose
JScrollPane jScrollPane=new JScrollPane(table);
panel.add(jScrollPane); // this is to add new table to panel
panel.revalidate();
panel.repaint();
这部分代码第一次运行良好,并显示了新表。现在,用户选择其他选项,例如,他希望对表进行着色。所以在主窗口我这样做:
customPanel1=new ColorPanel(table);
customPanel1应该在此构造函数中接收对新创建的表对象的引用,但它没有。主窗口仍在发送对旧表对象的引用。
我想在这里放一些代码,但我希望从我的简历中可以很容易地理解,因为我的代码有点大。
发布于 2014-04-03 14:02:11
这么说吧。您不希望继续创建新表,删除旧表并添加表。完全没有必要。要更改表数据,需要交换TableModels
或更改现有的表数据。您可以在创建TableModel和如何使用表上看到更多信息。
尝试作为一个简单的测试(而不是删除旧表并创建一个新表),只需更改数据/模型即可。
Object[] colNames = { "Col 1", "Col 2", "Col 3" };
Object[][] data = { { "Data", "Data", "Data" },
{ "Data", "Data", "Data" },
{ "Data", "Data", "Data" } };
DefaultTableModel model = new DefaultTableModel(data, cols);
table.setModel(model);
您应该会看到数据自动更改。
另外,如果您确实需要交换视图,而不是尝试添加一个删除容器,那么您应该考虑使用CardLayout
来交换视图,而不必添加和删除组件(这可能会很麻烦)。您可以在如何使用CardLayout和这里上看到更多内容。此外,您还可能希望查看如何在Netbeans生成器中使用CardLayout
更新
“因此,我必须清除每个用户对表所做的更改,以便与更改相匹配,例如,空构造函数(新JTable() )”
你可以用模型做这件事。查看您可以使用的DefaultTableModel
中的所有方法。如果使用DefaultTableModel
初始化表
DefaultTableModel model = new DefaultTableModel();
JTable table = new JTable(model);
然后,您可以使用以下方法
public void setColumnIdentifiers(Object[] newIdentifiers)
-更改标头public void setRowCount(int rowCount)
-设置行数。使用0清除模型。public void addRow(Object[] rowData)
-动态添加行。
还有更多的方法。看看API
https://stackoverflow.com/questions/22849684
复制相似问题