Java JPanel中的组件将自动消失

Java JPanel中的组件将自动消失,java,swing,jpanel,repaint,jung,Java,Swing,Jpanel,Repaint,Jung,我有一个JPanel和一个Jlist,当用户在列表中选择不同的项目时,相应的组件将添加到面板中,而之前的组件将被删除。以下是代码的一部分: depictorPanel.removeAll(); depictorPanel.invalidate(); depictorPanel.repaint(); GridBagConstraints constraints = new GridBagConstraints(); constraints.fill = GridBagConstraints.BOT

我有一个JPanel和一个Jlist,当用户在列表中选择不同的项目时,相应的组件将添加到面板中,而之前的组件将被删除。以下是代码的一部分:

depictorPanel.removeAll();
depictorPanel.invalidate();
depictorPanel.repaint();
GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
depictorPanel.add(viewer, constraints);
viewer.setSize(depictorPanel.getSize());
depictorPanel.invalidate();
depictorPanel.repaint();
其中,DescriptorPanel是JPanel,查看器是组件(顺便说一句,查看器是来自JUNG库的VisualizationView类型,它也继承了JPanel)

当我调整JPanel的大小(通过调整整个窗口的大小来完成,以便调整窗口中的所有组件的大小)或最小化窗口并将其还原时,查看器组件就消失了,因为我设置了DescriptorPanel和查看器的不同背景色


我还处理了DescriptorPanel的
组件Resistized
侦听器以使查看器无效并重新绘制,但运气不佳。

我找到了解决问题的方法,即不使用任何布局管理器手动管理布局(手动设置位置和大小,并在调整DescriptorPanel的大小时调整大小).

我找到了解决问题的方法,即不使用任何布局管理器手动管理布局(手动设置位置和大小,并在调整DescriptorPanel的大小时调整大小)。

我最终找到了一种使用布局管理器(GridBagLayout)的工作方法:

这段代码产生了我所期望的效果。我认为我的问题在于没有很好地理解每个布局管理器(因为我对Java相对较新)


谢谢大家!通过这个问题(和SSCCE),我确实学到了一些关于Java的知识:-)

我终于找到了一种使用布局管理器(GridBagLayout)的工作方法:

这段代码产生了我所期望的效果。我认为我的问题在于没有很好地理解每个布局管理器(因为我对Java相对较新)


谢谢大家!通过这个问题(和SSCCE),我确实学到了一些关于Java的知识:-)

要获得更好的帮助,请尽快发布一篇文章,您还可以采用另外两种策略。1) 如果经常显示具有不同详细信息的
viewer
,则只需使用一个
viewer
,然后刷新详细信息。2) 如果
查看器
也可能是
编辑器
常规设置
(即特定组件的数量有限(少于50个),请使用
卡片布局
@!你是对的,我认为使用一个单一的查看器,但不同的细节是更好的方法。使用CardLayout是不可取的,因为要显示的不同图形可以是任意(大)数字。此外,我仍然想知道为什么我当前的代码不起作用。“我仍然想知道为什么我当前的代码不起作用。”这方面的专家可能仍在等待@Reimeus建议的SSCE@WeixiangGuan不,你应该阅读什么是SSCEE(不是一个平台):为了更好的帮助&尽快发布一篇文章,你可能会采取另外两种策略。1) 如果经常显示具有不同详细信息的
viewer
,则只需使用一个
viewer
,然后刷新详细信息。2) 如果
查看器
也可能是
编辑器
常规设置
(即特定组件的数量有限(少于50个),请使用
卡片布局
@!你是对的,我认为使用一个单一的查看器,但不同的细节是更好的方法。使用CardLayout是不可取的,因为要显示的不同图形可以是任意(大)数字。此外,我仍然想知道为什么我当前的代码不起作用。“我仍然想知道为什么我当前的代码不起作用。”这方面的专家可能仍在等待@Reimeus建议的SSCE@WeixiangGuan不,你应该阅读什么是SSCEE(不是一个平台):“我找到了解决我问题的方法……”这种方法将产生10个新问题。javagui可能必须在许多平台上工作,在不同的屏幕分辨率上&使用不同的plaf。因此,它们不利于部件的精确放置。要组织一个健壮的GUI组件,请改用布局管理器,或者与布局填充和边框一起使用。@AndrewThompson我理解你的意思,如果布局管理器有效,我确实希望使用它们!但正如我所听到的,Java应该被编译一次并在任何地方运行,所以我假设无论我做什么,如果代码在这里工作,它也应该在那里工作。“Java应该被编译一次并在任何地方运行”人们被批评说Java是“编译一次,到处测试”。您似乎没有理解的一点是,“布局管理器”是一种Java方式,它通过布局组件提供“一次编译,在任何地方运行”的理念,而
null
布局管理器则是..相反,它将在各种实现中中断。您应该尝试并找出如何在不使用布局的情况下提供中显示的GUI。它显示了使用它们的力量。“我找到了解决问题的方法…”这种方法将产生10个新问题。javagui可能必须在许多平台上工作,在不同的屏幕分辨率上&使用不同的plaf。因此,它们不利于部件的精确放置。要组织一个健壮的GUI组件,请改用布局管理器,或者与布局填充和边框一起使用。@AndrewThompson我理解你的意思,如果布局管理器有效,我确实希望使用它们!但正如我所听到的,Java应该被编译一次并在任何地方运行,所以我假设无论我做什么,如果代码在这里工作,它也应该在那里工作。“Java应该被编译一次并在任何地方运行”人们被批评说Java是“编译一次,到处测试”。您似乎不明白的一点是,“布局管理器”是一种Java方式,它通过布局组件提供“一次编译,在任何地方运行”的理念,而
GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
constraints.gridx = 0;
constraints.gridy = 0;
constraints.weightx = 1;
constraints.weighty = 1;
depictorPanel.add(currentViewer, constraints);
depictorPanel.revalidate();