如何关闭扩展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 JFrame
s 不是一个好习惯.
"当有人找到这个词时,我想关闭程序的框架以打开一个新的" - 不要。再次将游戏状态重置为开始
【参考方案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
。面板不是窗口(@987654326@ 是窗口)。一个JPanel
,一个JComponent
可以是add()
ed 和remove()
d 来自Container
类。它不能关闭。顺便说一句:如果您发现我的评论有用,那么在 SO 上投票是一种很好的做法。【参考方案3】:
也许将整个 Game 类包装在一个父类中,该父类可以控制新 JFrame 的创建,以及向其中添加 Game JPanel?
这将在逻辑上分离组件,因为当组件类(要添加到容器中)被扩展然后继续创建自己的容器时,它可能会令人困惑(如果 UI 设置完成,这实际上很好 一次,但可能不是一个可重复的过程)。
【讨论】:
【参考方案4】:针对您的问题:
您可以只扩展JFrame
而不是JPanel
。
您可以在构造函数中设置 JFrame 的关闭操作 (frame
)。使用setDefaultCloseOperation
https://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 类中实现 ActionListener?