如何显示和隐藏现有的JFrame

时间:2018-11-14 18:25:16

标签: java swing

我正在做一些基本测试以了解Java Swing的工作原理。

我有一个包含三个完全独立的窗口(JFrames)的测试应用程序:

  1. 主菜单
  2. 资产窗口1
  3. 资产窗口2

主菜单具有一个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中构建这种多窗口应用程序?

1 个答案:

答案 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);
        }
    }
}