【发布时间】:2018-11-14 18:25:15
【问题描述】:
我正在做一些基本测试以了解 Java Swing 的工作原理。
我有一个由三个完全独立的窗口 (JFrame) 组成的测试应用程序:
- 主菜单
- 资产窗口 1
- 资产窗口 2
主菜单有一个 JButton,它将显示/隐藏 Asset Window 1 (a1)。
这是启动所有窗口的主类:
package test1;
import test1.AssetList.AssetList;
import test1.MainMenu.MainMenu;
import javax.swing.*;
public class Test1 {
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
MainMenu m = new MainMenu();
AssetList a1 = new AssetList();
AssetList a2 = new AssetList();
}
});
}
}
这是带有 Asset Window JFrame 的类:
package test1.AssetList;
import javax.swing.*;
public class AssetList extends JFrame {
public AssetList() {
JLabel label = new JLabel("Asset list");
this.getContentPane().add(label);
this.pack();
this.setVisible(false);
}
}
这是 MainMenu JFrame 的类:
package test1.MainMenu;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JButton;
public class MainMenu extends JFrame {
JLabel label = new JLabel("Main Menu");
JButton button = new JButton("Asset");
public MainMenu() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.getContentPane().add(label);
this.getContentPane().add(button);
button.addActionListener(new ButtonAssetListener());
this.pack();
this.setVisible(true);
}
}
这是 Asset Window Button JButton 监听器的类:
package test1.MainMenu;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ButtonAssetListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent evt) {
System.out.println("CLICK!");
/* PSEUDOCODE
if(a1 from Test1.isVisible()==true) {
a1 from Test1.setVisible(false);
} else {
a1 from Test1.setVisible(true);
}
*/
}
}
如何从 ButtonAssetListener 检索 a1 实例以切换其可见性? 在 Java Swing 中构建这种多窗口应用程序是否有更好的替代方案?
【问题讨论】:
-
您不应该使用多个框架。如果您想要多个窗口,则使用 JDialog 作为子窗口到主父框架。
-
@AndrewThompson 感谢您的 cmets。我会仔细阅读这篇文章
-
即使在主父框架中使用多个JDialogs作为子窗口,访问其他窗口的问题仍然存在。
-
@AndrewThompson 在阅读完帖子后,我不是 100% 清楚我是否应该选择多个 JFrame。我的应用程序将是多显示器并且必须允许完全可定制的布局。每个窗口都将是自治的并且与其他窗口松散相关。我可能会对这两种解决方案进行测试。