- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
经过实验,在我看来,Swing 的 GroupLayout 往往会丢失打算在我的 GUI 中重复使用的组件。
但我没有在文档中看到任何明确说明此一次性使用规则的内容。这让我想知道我是否犯了错误,或者我是不是一个糟糕的读者。
例如,我使用 JButton("Foo") 的 GroupLayout 创建了一个 JPanel。然后我用同一个 JButton 的 GroupLayout 重命名为“Bar”制作另一个 JPanel。
如果我使用 JFrame.setContentPane 从第二个 JPanel 切换回第一个 JPanel,我将丢失第一个 JPanel 中的 JButton。
谁能解释为什么它会丢失组件,此外,谁能提供一种方法来克服丢失组件的趋势?
这是演示问题的完整 SSCCE:
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class GroupLayoutTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
deployGroupLayoutTest();
}
});
}
static JPanel firstPanel;
static JButton jbtnActionLog;
static JFrame systemFrame;
public static void deployGroupLayoutTest() {
systemFrame = new JFrame("Group Layout Test");
systemFrame.setSize(300, 300);
firstPanel = new JPanel();
JMenuBar jmbSystem = new JMenuBar();
JMenu jmuAction = new JMenu("Action");
JMenuItem jmiActionLog = new JMenuItem("Login");
jmuAction.add(jmiActionLog);
jmbSystem.add(jmuAction);
jbtnActionLog = new JButton("Login");
jbtnActionLog.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setContentPaneToSecondPanel();
}
});
systemFrame.setJMenuBar(jmbSystem);
GroupLayout gl = new GroupLayout(firstPanel);
firstPanel.setLayout(gl);
gl.setAutoCreateContainerGaps(true);
gl.setAutoCreateGaps(true);
GroupLayout.ParallelGroup hGroup = gl.createParallelGroup(GroupLayout.Alignment.CENTER);
hGroup
.addComponent(jbtnActionLog);
gl.setHorizontalGroup(hGroup);
GroupLayout.SequentialGroup vGroup = gl.createSequentialGroup();
vGroup
.addComponent(jbtnActionLog);
gl.setVerticalGroup(vGroup);
systemFrame.getContentPane().add(firstPanel);
systemFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
systemFrame.setLocationByPlatform(true);
systemFrame.setVisible(true);
}
public static void setContentPaneToSecondPanel() {
jbtnActionLog.setText("Logout");
ActionListener[] listenerList = jbtnActionLog.getActionListeners();
jbtnActionLog.removeActionListener(listenerList[0]);
jbtnActionLog.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
systemFrame.setContentPane(firstPanel);
systemFrame.revalidate();
}
});
JPanel secondPanel = new JPanel();
GroupLayout gl = new GroupLayout(secondPanel);
secondPanel.setLayout(gl);
gl.setAutoCreateContainerGaps(true);
gl.setAutoCreateGaps(true);
GroupLayout.ParallelGroup hGroup = gl.createParallelGroup(GroupLayout.Alignment.CENTER);
hGroup
.addComponent(jbtnActionLog);
gl.setHorizontalGroup(hGroup);
GroupLayout.SequentialGroup vGroup = gl.createSequentialGroup();
vGroup
.addComponent(jbtnActionLog);
gl.setVerticalGroup(vGroup);
systemFrame.setContentPane(secondPanel);
systemFrame.revalidate();
}
最佳答案
我没有仔细阅读您的所有代码,但根本不可能将单个 Swing 组件添加到多个父级。每个组件只能出现在 Swing 层次结构中的一个位置。所以代码
JPanel firstPanel = ...;
JPanel secondPanel = ...;
JButton button = ...;
firstPanel.add( button );
secondPanel.add( button );
将导致 button
仅包含在其中一个面板中,而不是同时包含在两个面板中。这与 GroupLayout
无关。
相关SO question包含指向 Swing tutorial 的链接解释一下:
Each GUI component can be contained only once. If a component is already in a container and you try to add it to another container, the component will be removed from the first container and then added to the second
关于java - Swing 的 GroupLayout 和 setContentPane - 丢失组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10252279/
此代码连接到 mysql 并在 JFrame 中显示表。首先,我尝试了 frame.add(table) 但它不起作用,但是 frame.setcontentpane(table )这段代码运行正常,
因此,我将进入 Java 中的 GUI,并尝试为计时器创建一个简单的主菜单。一切都很好,直到我尝试为 GUI 添加背景。添加背景有效,但是所有其他组件现在都消失了(按钮)。我该如何解决这个问题? 编辑
我正在工作中处理一个测试示例,我需要使用绝对布局。这就是老板想要的。我在网上找到了一个简单的示例,可以正常工作,我可以将自定义组件放在上面,框架显示得很好。 但是当我尝试在已经存在的表单上执行此操作时
此代码输出一个框架,其中在图像上放置了一个按钮。如果我将语句从 fr.setContentPane( new JPanel... 更改为 fr.add(new JPanel...),我只会看到大小为
我正在制作一款游戏,玩家试图在迷宫中导航,但我遇到了两个绝对难倒我的错误。我的第一个问题是使用setContentPane()。每当我将其设置为我想要的背景时,它都会覆盖屏幕上的其他所有内容。我尝试过
我的小程序有问题:它没有在我需要时刷新。 我试图在单击按钮时从一个界面屏幕切换到另一个界面屏幕。 我有一个 public class PixelRainEditorApp extends JApple
我正在学习 Java 中的 GUI 编程,并尝试修改现有程序以将包含按钮的垂直左侧面板添加到我的主框架。 主要方法如下。目前,MainPanel 类扩展 JPanel 并包含程序的主要组件(基本游戏)
这个问题我想了很久。 我通常通过使用 JFrame 和 JPanel 来构建我的 SWING 程序,该 JPanel 包含由 setContentPane() 设置为内容 Pane 的窗口内容.当我希
我找到了三种方法来填充我的 JFrame frame = new JFrame("...")createContentPanel 返回一个 JPanel,createToolBar 返回一个 Tool
import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; publi
如果这有助于解决问题,我可以提供所有代码,但我相信,由于这实际上只影响一个类,因此可以在这里解决它,以简化问题。 我有一个 Solitaire 项目(注意包/类名称,这是反复试验,我没有删除旧项目),
这是我的代码。当我 setContentPane(panel) 时,它可以工作,但是当我 getContentPane().add(panel) 时,它不起作用。 为什么第二种方法不起作用? (它没有
经过实验,在我看来,Swing 的 GroupLayout 往往会丢失打算在我的 GUI 中重复使用的组件。 但我没有在文档中看到任何明确说明此一次性使用规则的内容。这让我想知道我是否犯了错误,或者我
我是一名优秀的程序员,十分优秀!