当前位置: 首页 > 知识库问答 >
问题:

从JFrame[Java]关闭JPanel窗口

慕晨
2023-03-14

所以,我想用JPanel制作一个菜单屏幕,我让它工作了,但是当我按下开始按钮时,它不会关闭菜单窗口,它只是创建一个新窗口,我如何保持它在同一个窗口上,而不关闭/打开菜单窗口,或者我想关闭菜单窗口并打开游戏窗口(JPanel),当我按下开始按钮时。

这是主课。JAVA

    package bombermangame;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class MainClass extends JFrame{
    private static final long serialVersionUID = 1L;

    public static int WIDTH = 870, HEIGHT = 800;
    public static JPanel menu = new Menu();
    public static Listener keys = new Listener();

    public MainClass(){
        setContentPane(menu);
        pack();
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("BomberMan V0.3");
        setSize(WIDTH, HEIGHT);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        new MainClass();
    }
}

这里是Menu.java班

 package bombermangame;

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Timer;
    import java.util.TimerTask;

    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;

    public class Menu extends JPanel implements ActionListener {
        private static final long serialVersionUID = 1L;

        private JButton startButton = new JButton("Play");

        private int x = 0, y = 500;

        private boolean down = false;
        private boolean up = true;

        private Timer timer = new Timer();

        public Menu() {
            setBackground(Color.blue);
            startButton = new JButton("Start");
            startButton.setBounds(0,0, 100, 40);
            startButton.setPreferredSize(new Dimension(100, 40));
            startButton.addActionListener(this);
            startButton.setFocusPainted(true);
            this.add(startButton);


        public void actionPerformed(ActionEvent ae) {
            Object a = ae.getSource();
            Game game = new Game();
            MainClass frm = new MainClass();
            Listener keys = new Listener();

            if (a == startButton) {
                timer.cancel();
                frm.getContentPane().remove(new Menu());
                frm.addKeyListener(keys);
                frm.setContentPane(game);
                frm.revalidate();
                frm.repaint();
                game.setBackground(Color.BLACK);
                game.setDoubleBuffered(true);
                game.setBounds(0, 0, WIDTH, HEIGHT);
                Game.running = true;
            }
        }

    }

编辑:感谢@威士忌蜘蛛的帮助,我了解到我做了2帧,没有正确引用它们。但是现在我解决了这个问题,我的监听器有一个问题,当我修复这个问题时,我的Jboard将无法与我的监听器一起工作。我尝试将监听器直接添加到我的游戏JPanel和我的主流类JFrame中,但两者都不起作用。

这是我的菜单课,

    public void actionPerformed(ActionEvent ae) {
    Object a = ae.getSource();
    JPanel game = new Game();
    Listener keys = new Listener();

    if (a == startButton) {
        timer.cancel();
        MainClass.frame.getContentPane().remove(this);
        MainClass.frame.setContentPane(game);
        MainClass.frame.addKeyListener(keys);
        game.addKeyListener(keys);
        game.setBackground(Color.BLACK);
        game.setDoubleBuffered(true);
        game.setBounds(0, 0, WIDTH, HEIGHT);
        Game.running = true;
    }
}

共有1个答案

澹台浩广
2023-03-14

您在这里创建了一个主流类:

public static void main(String[] args) {
    new MainClass();
}

... 再一次在这里。。。

public void actionPerformed(ActionEvent ae) {
    Object a = ae.getSource();
    JPanel game = new Game();
    JFrame frm = new MainClass();

然后,当您尝试删除菜单时,您创建了一个新菜单,而不是对现有菜单进行引用:

frm.getContentPane().remove(new Menu());

您需要重新考虑一下您的设计,并确保引用的对象是正确的(已经存在)。也就是说,您在引用现有对象时正在创建新对象。

 类似资料:
  • 我有一个带有登录名(JPanel)的JFrame,可以从菜单栏中选择。菜单栏还根据用户角色显示选项。当用户第一次登录创建的JFrame实例时,当我在菜单栏上选择login并在new JFrame上实例化时,我的问题就出现了,因为我显然打开了两个JFrame,我找不到从JPanel隐藏或关闭之前JFrame的方法。在实例化新JFrame或任何其他可能的解决方案之前,有没有办法隐藏/处理所有打开的窗口

  • 问题内容: 我有一个按钮添加到JTabbedPane添加到JPanel与这样的事情: 我想在按钮按下时关闭窗口。我尝试这样做: 但这给了我 我如何在按下按钮时关闭窗口 问题答案: 获取顶层窗口: 确保已将JFrame的默认关闭操作设置为(首选)或(首选)。 如果有可能会从JMenuItem调用此方法,那么除非您首先测试组件的父级是JPopupMenu还是JToolBar,否则它将不起作用。如果是这

  • 问题内容: 我有一个Java程序,其中包含一个从JFrame继承的 Application 类。 我想显示一条消息,询问用户单击窗口右上方的X按钮是否要退出程序。 到目前为止,这是我的代码: 我从网上找到的教程中获得了此代码。我自己编写了WindowClosing事件处理程序的代码。但是,我在注册窗口侦听器(addWindowListener)时遇到麻烦。它告诉我WindowAdapter是抽象的

  • 我有一个Java程序,其中包含一个从JFrame继承的类Application。 我想显示一条消息,询问用户单击窗口右上角的X按钮是否要退出程序。 这是我目前的代码: 我从网上找到的教程中得到了这段代码。我自己编写了WindowClosing事件处理程序。但是,我在注册窗口侦听器(addWindowListener)时遇到问题。它告诉我WindowAdapter是抽象的,不能实例化。 请问我怎样才

  • 嗨,我有一个jFrame,我想问问用户,当单击close按钮时,他是否确定要关闭jFrame: 当他从jpanel弹出窗口中选择“否”按钮时,我该如何撤消关闭操作?

  • 问题内容: 我不知道如何使用此代码: 使用x按钮关闭程序。 问题答案: 你需要线 因为按下X按钮时JFrame的默认行为等效于 因此,几乎所有时候,创建JFrame时都需要手动添加该行 我目前指的是like 中的常量,而不是像先前那样直接声明的常量更能反映意图。