【问题标题】:GUI components disappearing when resizing调整大小时 GUI 组件消失
【发布时间】: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。我面临两个我认为相关的问题。

  1. 当我启动程序时,初始 JScrollPane 中的一些组件没有出现。我在此窗格中有几个按钮和一个 JLabel,但只显示第一个按钮。当我的鼠标经过它们时,其余按钮将出现,但在那之前,它们是不可见的。这看起来很奇怪,因为它表明我的构造函数有某种错误。当使用 changeMenuTo() 方法调出同一个窗格时,它看起来很完美。

  2. 每当我手动调整屏幕大小时,当前窗格中的所有组件都会消失。这几乎就像我第一次启动程序时一样,按钮是不可见的,直到我的鼠标经过它们。在这种情况下,第一个按钮也是不可见的。

【问题讨论】:

  • 您还没有发布有效的minimal reproducible example,这是一个我们可以实际编译、运行和修改的小程序,因此即使不是不可能,也很难确切地告诉您您的程序为什么不工作,除了说这个代码:pane.setLayout(null);,你是在踢自己的脚。正如本网站上许多 Swing 问题的答案所告诉您的那样,使用空布局即使不是愚蠢也是危险的,并且会导致难以调试错误以及难以创建和维护 GUI。
  • 2) 你真的想使用 [CardLayout]((docs.oracle.com/javase/tutorial/uiswing/layout/card.html))。
  • panel.setLayout(null)是你的第一个问题
  • 为什么要从 JScrollPane 扩展您的组件,这对我来说似乎是一个奇怪的想法。您也可以考虑改用 CardLayout

标签: java swing paint


【解决方案1】:

更改布局已解决此问题。感谢您的建议。

【讨论】: