【问题标题】:How to close a class the extends JPanel [duplicate]如何关闭扩展JPanel的类[重复]
【发布时间】: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 不是一个好习惯.
  • "当有人找到这个词时,我想关闭程序的框架以打开一个新的" - 不要。再次将游戏状态重置为开始

标签: java swing


【解决方案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】:

      针对您的问题:

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

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

      【讨论】:

      • 但是,我可以在不扩展jpanel的情况下使用paintComponent方法吗?
      • 没有。您到底需要paintComponent 做什么?您似乎只在用户点击时更新 UI。
      • 我其实是在程序里画刽子手
      • "但是,我可以在不扩展 jpanel 的情况下使用paintComponent 方法吗?" - 不能
      • 作为一般的经验法则,从像JFrame 这样的顶级容器扩展是一个坏主意,99% 的情况下,您不会向类添加新功能,而是只是将自己锁定在一个用例中。 99% 的情况下,您可以获得与从 JFrame 扩展相同的结果,只需在需要时创建一个新实例即可
      猜你喜欢
      • 2013-03-19
      • 2019-03-19
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 2011-01-16
      • 1970-01-01
      相关资源
      最近更新 更多