【问题标题】:How to close a JFrame while opening another JFrame? [duplicate]如何在打开另一个 JFrame 时关闭一个 JFrame? [复制]
【发布时间】:2019-02-22 02:02:14
【问题描述】:

我有一个框架 (main)。有两个按钮:Items 和 Sale。

当我单击按钮 Items 时,它会打开一个框架 (Items) 我想,当我点击按钮Sale时,它应该关闭Items并打开Sale

这是Items 框架:

public class Items extends JFrame {

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Items frame = new Items();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}
}

更新:- 这是我的销售课程

public class Sale extends JFrame {
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Sale frame = new Sale();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}
}

【问题讨论】:

  • 1) 见The Use of Multiple JFrames, Good/Bad Practice? 很可能第二个“框架”应该是一个对话框。请参阅已接受的答案以获取替代方案。 2) 为了尽快获得更好的帮助,请发帖minimal reproducible exampleShort, Self Contained, Correct Example
  • 为什么您甚至需要关闭并打开一个新框架。为什么不尝试使用带有销售面板和其他内容的卡片布局。当您单击销售时,调用卡片布局 next() 方法。您甚至可以在需要时返回其他面板。这让你的生活变得轻松。关闭和打开框架很费时间,而且不好。
  • 看起来 JTabbedPane 是您所需要的。您的两个按钮被标签“标题”替换,并且在用户单击这些标题时实现关闭(/处置)和打开框架的效果。

标签: java swing jframe


【解决方案1】:

您应该 .dispose(); 按钮的 ActionListener 中的框架,并且由于您在类中扩展 JFrame 这意味着您 .dispose(); 实例本身。像这样的:

public class Main extends JFrame {
    public Main() {

        Sale sale = new Sale();
        Items item = new Items();

        JButton btnSale = new JButton("Sale");
        getContentPane().add(btnSale, BorderLayout.WEST);

        JButton btnItems = new JButton("Items");
        getContentPane().add(btnItems, BorderLayout.CENTER);
        btnSale.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                sale.setVisible(true);
                if(item.isVisible()) {
                    item.dispose();
                }

            }
        });

        btnItems.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                item.setVisible(true);
                if(sale.isVisible()) {
                    sale.dispose();
                }

            }
        });
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Main frame = new Main();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

}

【讨论】:

  • 当我在 main frame 中输入 sale 时,它​​没有给出 dispose() 的建议;有 getFrames()、getWindows() 选项。等
  • 甚至手动输入也会产生错误。但是当我点击查看产生了什么错误时。它说没有可用的建议
  • @Manjit saha。那么您的 Sale 类是否扩展了 JFrame?如果不是,您可以调用该类的框架,我不知道您将其命名为什么,但类似 ​​sale.frame.dispose(); .还要确保将 Sale 类中的框架设为“public”,以便在 Main 类中使用它
  • @Manjitsaha 同样在 if() 条件中应该是 if(sale.frame.isVisible){}。如果您尝试调用的类没有扩展 JFrame
  • 我已将所有类扩展到 JFrame。
【解决方案2】:

只需使用dispose() 方法关闭上一个Item JFrame。

salesframe.setVisible(true);
itemframe.dispose();

在您的情况下,我认为您还应该向按钮添加一个 ActionListener。

jButton1.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e)
    {
       frameToClose.dispose();
    }
});

【讨论】:

  • 这不起作用
  • 从字面上看,我有三个框架......一个框架有两个按钮。以及可以使用这些按钮打开的两个框架......我想要的是当我通过单击一个按钮打开一个新框架时,具有按钮的框架也应该是可见的。然后当我点击销售按钮时,它应该关闭项目框架并打开销售框架
  • 您能否提供一些有关该错误的详细信息? dispose() 应该与 JFrame 关闭一起工作。
  • 控制台没有错误..它只是不关闭框架
  • 将这三个框架作为面板并将它们添加到一个框架中作为卡片布局。现在您需要做的就是根据单击的按钮调用卡片布局的 next() 或 previous() 方法。它会比关闭和打开框架更简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多