创建和丢弃运行线程的JFrame

问题描述 投票:1回答:1

我正在使用Java Swing编写俄罗斯方块。 Game类围绕一个JFrame(框架)旋转,该框架由一个TetrisPanel扩展块所在的JPanel(面板),一个JLabel(pontok)点计数器,一个显示高分的JTextArea(rekord_text)和另一个显示JPanel(kovi)的组件组成。下一个要掉的块。我的想法是,游戏具有3个难度级别,其中方块以不同的速度掉落。

我认为解决此问题的最佳方法是使用上述组件创建一个新的JFrame,但将块的速度设置为不同。我能够关闭旧的JFrame。但是,当新的JFrame打开时,它只是一个空白框架,并且不会响应关闭窗口。

我应该补充说,TetrisPanel正在运行线程,但是我有90%的把握要使用一个易失的布尔值来停止它。

游戏类的构造函数:

        this.difSet(nehezseg);  //this function sets the falling velocity
        TetrisPanel.stopped = true;  //this static member is the volatile boolean responsible for stopping the thread
        new_game = false;

        frame = new JFrame("Tetris_alpha");

        frame.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();

        panel = new TetrisPanel();
        TetrisPanel.stopped = false;
        new Thread(panel).start();
        frame.add(panel, c);

        pontok = new JLabel ("0");
        frame.add(pontok, c);

        rekord_text = new JTextArea();
        //i set up the area
        frame.add(rekord_text, c);

        kovi = new NextAktualPanel();
        frame.add(kovi, c);

        menu = new MyMenu(this);
        frame.setJMenuBar(menu);

        frame.addWindowListener(new WindowAdapter()
            {
                @Override
                public void windowClosing(WindowEvent e)
                    {
                        rekordok.add(panel.getPont());
                        rekordok.write(f);
                        e.getWindow().dispose();
                        System.exit(0);
                    }
                }
        );

        frame.pack();
        frame.setVisible(true);
    }

包含游戏循环的Game.start()函数:

public void start()
    {
        //game_loop
        while (!panel.GameOver() && !new_game)
        {
                if (panel.aktualLeertDetector())
                {   
                    panel.addAktualToBlocks();
                    panel.addNewAktual(next);
                    Elem temp = new Elem(0,0,rand.nextInt(7)); 
                    while (temp.getTipus() == next.getTipus())
                        temp = new Elem(0,0,rand.nextInt(7));
                    next = temp;
                    kovi.setNextAktual (next);
                }
                if (!paused)
                    pontok.setText(Integer.toString(panel.getPont()));
                kovi.repaint();
                panel.repaint();
        }

打开新框架的功能:

Public void newGame (Game g)
{
            Game.new_game = true;
            g.frame.dispose();
            Game new_game = new Game("easy");
            g = new_game;
            g.start();
}

以及TetrisPanel的run()函数:

public static volatile boolean stopped = false;
@Override
    public void run() {
        while (!stopped)
        {
            aktual.zuhan();
            this.sorTeleAction();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

将提供任何帮助,包括对不同方法的想法。

我正在使用Java Swing编写俄罗斯方块。 Game类围绕一个JFrame(框架)旋转,该框架由一个TetrisPanel扩展块所在的JPanel(面板),一个JLabel(pontok)点计数器组成,...

java swing jframe jpanel java-threads
1个回答
0
投票
  1. [请勿使用易失性布尔值作为状态变量,而应使用AtomicBoolean,易失性不是执行此类操作的正确方法,也不会导致“立即变量更新” ...这不是易失性的目的。
© www.soinside.com 2019 - 2024. All rights reserved.