2014-04-03 40 views
0

主窗口类(扩展JFrame,使用GUI编辑器构建)持有对JTable对象(让我们称之为)的引用。开始时为空的new JTable()。并添加到JPanel(我们称之为jpanel1),它也在主窗口中。不改写的摇摆表

用户现在从菜单中选择了他想做的事 - 如创建新表,编辑表等颜色.. 如果他选择,他希望创建新表,然后特别延长JPanel(让我们称之为它customJPanel1)与选项一起显示。 customJPanel1从主窗口收到对的引用。这是我们将要处理的表格。

现在,用户已经为JTable的不同构造函数显示了不同的选项。他挑选一个并填写一些信息,然后按下按钮。 之后,根据他选择新的JTable创建。

例如,如果他选择空的构造函数,则会发生这种情况: table=new JTable() in customJPanel1。正如你所知道的,你只是无法做到这一点摆动部件,当他们被显示。所以我这样做:

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应在此构造接收参考新创建的表对象,但事实并非如此。 主窗口仍在发送参考旧表格对象

我想在这里放一小段代码,但我希望从简历中能够很容易地理解,因为我的代码稍微大一些。

+0

尝试在更改后调用'panel.validate()'。 – Jared

+0

嘿,我忘了添加,但我打电话panel.revalidate()和面板与表显示。问题在于主窗口仍然以某种方式反而引用了旧表。还尝试在主窗口上调用revalidate()。 – user3495683

+0

你试过验证()'...'验证()'从来没有为我工作过。而当你说它拥有旧的引用时,你的意思是显示旧的表(而不是新的表),还是你的意思是实际的对象包含旧表而不是新表? – Jared

回答

3

所以这里的交易。您不想继续创建新表格,删除旧表格并添加新表格。完全没有必要。你想要做什么来改变表数据,是交换TableModels改变现有的。你可以在Creating a TableModelHow to Use Tables看到更多。

试试这是一个简单的测试(而不是删除旧表并创建一个新表),只需更改数据/模型。

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,让你交换意见的,而不必添加和删除组件(其可能会很麻烦)。你可以在How to Use CardLayout看到更多的一个简单的例子here。此外,你还可以想看看How to Use CardLayout with Netbeans GUI Builder


UPDATE

“所以我要明确表所做的每个更改用户为了匹配改变什么将例如空构造函数做(new 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

+0

如果有任何其他的帮助,我会去这个,但唯一的问题是,这个程序应该向用户显示表的工作原理,所以我将不得不清除每个用户对表进行的更改以匹配更改,例如空构造函数新的JTable())。所以不知何故模拟创建新的表。 – user3495683

+0

我不知道你的意思。我可以告诉你,表是_supposed_与模型一起工作。如果你真的想显示一张桌子是如何工作的,那么你应该展示一些关于桌子模型的东西。 –

+0

看我的**更新**。也许这会有所帮助。 –