gpt4 book ai didi

java - Swing 的 GroupLayout 和 setContentPane - 丢失组件?

转载 作者:行者123 更新时间:2023-11-30 09:38:08 25 4
gpt4 key购买 nike

经过实验,在我看来,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com