【问题标题】:How to show and hide an existing JFrame如何显示和隐藏现有的 JFrame
【发布时间】:2018-11-14 18:25:15
【问题描述】:

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

我有一个由三个完全独立的窗口 (JFrame) 组成的测试应用程序:

  1. 主菜单
  2. 资产窗口 1
  3. 资产窗口 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。我的应用程序将是多显示器并且必须允许完全可定制的布局。每个窗口都将是自治的并且与其他窗口松散相关。我可能会对这两种解决方案进行测试。

标签: java swing


【解决方案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);
        }
    }
}

【讨论】:

  • 我被推荐(外部堆栈溢出)使用带有 JFrames 的类作为静态资源。可以跨不同实体实例化类,并且可以访问 JFrame。有人建议我在单用户应用程序中使用此解决方案。在处理大量窗口时,跨不同类移动参数可能很麻烦。
  • @M.E.总的来说,我同意这一点。但是,在您的情况下,您有 1 个或多个“AssetList”框架,在许多应用程序中,您有 1 个 WinMain 类型类。此解决方案只是一种方法,也许您想对注册窗口的各种注册表做一些事情,然后您的 MainMenu 可以查看该注册表并查看那里的内容。可能是您的用例的更好方法。
  • 感谢您进一步评论您的回答。作为建议的一部分,提出了您提到的注册表方法。到目前为止,我只做非常基本的步骤,因为我需要学习 Swing(我过去曾使用其他语言的其他小部件框架,但没有使用 Swing),但如果有意义的话,我将进入某种注册表(其中可能是这种情况,因为窗口的数量是可变的)。我会逐渐融入所有这些。
猜你喜欢
  • 2014-12-27
  • 2011-05-16
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
  • 2022-06-13
  • 2013-02-09
  • 2012-12-17
  • 1970-01-01
相关资源
最近更新 更多