如何关闭扩展JPanel的类[重复]

Posted

技术标签:

【中文标题】如何关闭扩展JPanel的类[重复]【英文标题】:How to close a class the extends JPanel [duplicate] 【发布时间】:2016-05-20 00:11:54 【问题描述】:

我在java方面相对较新,我正在制作一个HangMan游戏,但我现在面临一个问题。特别是,当有人找到这个词时,我想关闭程序的框架以打开一个新的,但是因为我的那里的类​​扩展 JPanel dispose() 不是可用的解决方案。那么,我应该怎么做才能关闭这个框架呢? (请记住,它的对象是在另一个类中定义的,即调用该特定类的那个。)这是我的代码的一部分:(请原谅我显示了这么多行)我只想知道如何关闭此窗口不退出整个程序,感谢您的时间 :) )

编辑:谢谢大家,我真的通过这个“评论部分”学到了很多东西。感谢您的快速回复,我希望将来我不会再问这样愚蠢的问题:) PS:我实际上使用 CardLayout 来解决我的问题。我真的不认为这个问题与“如何以编程方式关闭 JFrame”有什么相似之处,因为在这个问题中我不能使用 dispose 方法,因为我正在扩展 JPanel。

 import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
//import java.io.File;
import java.util.*;
import java.util.concurrent.TimeUnit;
public class Game extends JPanel implements Runnable

public void paintComponent(Graphics g)

 super.paintComponent(g);
 this.setBackGround(Color.BLACK);




public void run()


 

【问题讨论】:

请发布minimum amount of code 来证明您的问题。这是太多无关紧要的代码,无法指望任何人阅读。 “我想关闭程序的框架以打开一个新的框架” - 请考虑像CardLayout 这样的替代方案,use of multiple JFrames 不是一个好习惯. "当有人找到这个词时,我想关闭程序的框架以打开一个新的" - 不要。再次将游戏状态重置为开始 【参考方案1】:

当有人发现单词时,我想关闭程序的框架以打开一个新的框架

简单的答案是,不要。而是将游戏的状态重置为初始状态并相应地更新 UI

【讨论】:

【参考方案2】:

JPanel 单独是不可见的,您需要将它放在某种容器中。此容器由panel.getParent() 接收。

有了它,您就可以将自己从父容器中移除。

这个示例类有一个JButton,当点击该面板时,它会从视图层次结构中移除。

public static class APanel extends JPanel 
    public APanel() 
        super();

        JButton btn = new JButton();
        btn.setText("Hello World!");
        btn.addActionListener(e -> 
            ((JButton) e.getSource()).setText("Boo!");
            final Container parent = APanel.this.getParent();
            parent.remove(APanel.this);
            parent.repaint();
        );
        add(btn);
    

【讨论】:

这实际上帮助了我的另一个程序,但是我可以做些什么来关闭这个特定的窗口还是我必须使用 CardLayout?谢谢你的时间 @Notorious_Hacker “这个特定的窗口”是什么意思?您的代码中有一个JPanel。面板不是窗口(@98​​7654326@ 是窗口)。一个JPanel,一个JComponent 可以是add()ed 和remove()d 来自Container 类。它不能关闭。顺便说一句:如果您发现我的评论有用,那么在 SO 上投票是一种很好的做法。【参考方案3】:

也许将整个 Game 类包装在一个父类中,该父类可以控制新 JFrame 的创建,以及向其中添加 Game JPanel?

这将在逻辑上分离组件,因为当组件类(要添加到容器中)被扩展然后继续创建自己的容器时,它可能会令人困惑(如果 UI 设置完成,这实际上很好 一次,但可能不是一个可重复的过程)。

【讨论】:

【参考方案4】:

针对您的问题:

您可以只扩展JFrame 而不是JPanel。 您可以在构造函数中设置 JFrame 的关闭操作 (frame)。使用setDefaultCloseOperationhttps://docs.oracle.com/javase/7/docs/api/javax/swing/JFrame.html#setDefaultCloseOperation(int) 您可以将构造函数中的JFrame 存储为实例字段,并在以后调用 dispose(当您需要重新启动游戏时)。

此外,使用带有键盘侦听器或“提交”按钮的文本字段可能会更容易 - 您不需要 26 个字母的按钮,并且 UI 会更加直观。

此外,使用数组会使许多其他变量消失。

【讨论】:

但是,我可以在不扩展jpanel的情况下使用paintComponent方法吗? 没有。您到底需要paintComponent 做什么?您似乎只在用户点击时更新 UI。 我其实是在程序里画刽子手 "但是,我可以在不扩展 jpanel 的情况下使用paintComponent 方法吗?" - 不能 作为一般的经验法则,从像JFrame 这样的***容器扩展是一个坏主意,99% 的情况下,您不会向类添加新功能,而是只是将自己锁定在一个用例中。 99% 的情况下,您可以获得与从 JFrame 扩展相同的结果,只需在需要时创建一个新实例即可

以上是关于如何关闭扩展JPanel的类[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将图像添加到 JPanel [重复]

如何将 JPanel 添加到 JFrame 十次 [重复]

如何在另一个类中的 JPanel 类中实现 ActionListener?

正确导出 node.js 中的类以在其他所需文件中扩展它们[重复]

静态扩展方法[重复]

将图像设置为 JPanel 背景的最简单方法