Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正确的方法是;互换;Java中的组件_Java_Swing_User Interface - Fatal编程技术网

正确的方法是;互换;Java中的组件

正确的方法是;互换;Java中的组件,java,swing,user-interface,Java,Swing,User Interface,我正在尝试这样做,当用户在我的GUI上单击某个东西时(与什么无关),一个JTable将消失,另一个JComponent将替换它 此时我正在使用以下代码,其中contentPanel是我设置为JFrame的内容窗格的JPanel: contentPanel.remove(table); contentPanel.add(component, BorderLayout.CENTER); contentPanel.updateUI(); 这非常有效,但我只想确认这是正确的方法。我的意思是,我想不出任

我正在尝试这样做,当用户在我的GUI上单击某个东西时(与什么无关),一个
JTable
将消失,另一个
JComponent
将替换它

此时我正在使用以下代码,其中
contentPanel
是我设置为
JFrame
的内容窗格的
JPanel

contentPanel.remove(table);
contentPanel.add(component, BorderLayout.CENTER);
contentPanel.updateUI();

这非常有效,但我只想确认这是正确的方法。我的意思是,我想不出任何其他方法来实现它,但这不一定意味着什么,如果有更好的方法来实现它,无论是在性能方面还是其他方面,我想知道它…

不,这不是实现它的方法。您不应该调用updateUI()。阅读API,该方法仅在更改LAF时使用

添加/删除组件后,应执行以下操作:

panel.add(...);
panel.revalidate();
panel.repaint(); // sometimes needed
(这是不可逆的),一个JTable将消失,另一个JComponent将取代它

也许这是相关的。通常,JTable显示在JScrollPane中。因此,也许更好的解决方案是使用:

scrollPane.setViewportView( anotherComponent );

然后滚动窗格将为您进行验证。

更好的方法是使用CardLayout,添加两个表,然后只显示正确的卡/表。

谢谢,我已经更改了代码,它仍然可以工作。除了这个小问题,我的代码还有什么需要修改的吗?谢谢你的编辑,这也是非常有用的!虽然仅供参考,但我所说的无关组件实际上是用户单击的组件,没有显示(或删除)!是的,我把问题看错了,我想说的重点是在滚动窗格中替换组件,而不是在单击的组件上。这只是偏好,不是吗?或者它会极大地影响我的代码的性能吗?当您在每个面板上用多个组件替换整个面板时,CardLayout非常方便。也就是说,每当您看到代码使用replaceAll()方法时,它都是CardLayout的候选者。使用CardLayout时,两张卡同时在内存中,因此会使用额外内存。@camickr:即使我初始化两个组件,CardLayout是否会使用更多内存?当您向JPanel添加组件时,它会占用更多的内存吗?如果您为所有组件分配内存,那么内存使用情况将相似。我想说的一点是,CardLayout只能在创建所有面板并将其添加到卡布局时确定要使用的大小。交换面板时,它们仍保留在内存中。当您移除/更换组件时,如果不再使用,它们可能会被垃圾收集。@camickr好的,谢谢。我想我会接受你的回答,但我也感谢Kylar的回答。谢谢@getah的评论,但评论是错误的。您不应该使用updateUI()(我不知道如何否决评论,否则我会)。我不知道人们在哪里一直有使用updateUI()的想法。它在我所属的每个论坛上都有。