我正在做一些基本测试以了解Java Swing的工作原理。
我有一个包含三个完全独立的窗口(JFrames)的测试应用程序:
主菜单具有一个JButton,该按钮将显示/隐藏资产窗口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中构建这种多窗口应用程序?
答案 0 :(得分:1)
您只需将要隐藏的实例传递给按钮侦听器即可。
public class Test1 {
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
AssetList a1 = new AssetList();
AssetList a2 = new AssetList();
MainMenu m = new MainMenu(a1);
}
});
}
}
使主菜单包含一个将显示和隐藏的组件。
public class MainMenu extends JFrame {
JLabel label = new JLabel("Main Menu");
JButton button = new JButton("Asset");
public MainMenu(JComponent assetList) {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.getContentPane().add(label);
this.getContentPane().add(button);
button.addActionListener(new ButtonAssetListener(assetList));
this.pack();
this.setVisible(true);
}
}
然后修改您的按钮资产侦听器以使用一个组件,该组件随后将显示或隐藏。
public class ButtonAssetListener implements ActionListener{
private JComponent component;
public ButtonAssetListener(JComponent component) {
this.component = component;
}
@Override
public void actionPerformed(ActionEvent evt) {
if(component.isVisible()) {
component.setVisible(false);
} else {
component.setVisible(true);
}
}
}