【发布时间】:2018-01-04 00:48:52
【问题描述】:
我正在编写一个程序,当按下按钮时,它会替换掉 GUI 的主要组件。为此,我有多个扩展组件 (JScrollPane) 的类,然后可以将其放入扩展 JFrame 的主类中。
JScrollPane menu;
public MenuSystem()
{
menu = new OpeningMenu(this);
setSize(500,500);
setLocationRelativeTo(null);
setTitle("Menu system");
setDefaultCloseOperation(EXIT_ON_CLOSE);
loadInfo();
pane = getContentPane();
pane.setLayout(null);
pane.add(menu);
setVisible(true);
}
public void changeMenuTo(JScrollPane x)
{
pane.remove(menu);
menu = x;
pane.add(menu);
pane.repaint();
}
这些代码位控制在 GUI 上显示哪些 JScrollPane。我面临两个我认为相关的问题。
当我启动程序时,初始 JScrollPane 中的一些组件没有出现。我在此窗格中有几个按钮和一个 JLabel,但只显示第一个按钮。当我的鼠标经过它们时,其余按钮将出现,但在那之前,它们是不可见的。这看起来很奇怪,因为它表明我的构造函数有某种错误。当使用 changeMenuTo() 方法调出同一个窗格时,它看起来很完美。
每当我手动调整屏幕大小时,当前窗格中的所有组件都会消失。这几乎就像我第一次启动程序时一样,按钮是不可见的,直到我的鼠标经过它们。在这种情况下,第一个按钮也是不可见的。
【问题讨论】:
-
您还没有发布有效的minimal reproducible example,这是一个我们可以实际编译、运行和修改的小程序,因此即使不是不可能,也很难确切地告诉您您的程序为什么不工作,除了说这个代码:
pane.setLayout(null);,你是在踢自己的脚。正如本网站上许多 Swing 问题的答案所告诉您的那样,使用空布局即使不是愚蠢也是危险的,并且会导致难以调试错误以及难以创建和维护 GUI。 -
2) 你真的想使用 [CardLayout]((docs.oracle.com/javase/tutorial/uiswing/layout/card.html))。
-
panel.setLayout(null)是你的第一个问题 -
为什么要从 JScrollPane 扩展您的组件,这对我来说似乎是一个奇怪的想法。您也可以考虑改用 CardLayout