切换帧

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

我试图通过一个按钮从一个帧切换到另一个帧。这是我的第一个框架代码:

JFrame f = new JFrame();
    f.setSize(width,height);
    f.setResizable(false);
    f.setVisible(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Icon play = new ImageIcon(getClass().getResource("play.png"));
    startB = new JButton(play);
    startB.setBounds(105,350,100,35);
    startB.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            f.dispose();
            MainProgram mp = new MainProgram();
            mp.run();

        }
    });

和MainProgram:

//run method
            public void run() {
                init();
                gameLoop();
            }

//init method
public void init() {
    s = new screen();
    rand = new Random();
    upPipes = new ArrayList<Rectangle>();
    downPipes = new ArrayList<Rectangle>();

    DisplayMode dm = s.compareDisplayModes(modes);
    s.setFullScreen(dm);

    Window w = s.getFullScreenWindow();
    w.setFont(new Font("Calibri", Font.PLAIN, 50));
    w.setForeground(Color.PINK);
    w.addKeyListener(this);
    w.setFocusable(true);

    loadPics();
    running = true;
}

但是当MainProgram的框架在屏幕上时,即使我已经添加了键监听器,它也不会听我的键盘。那是因为第一帧只处理但未关闭?无论如何要关闭它或使我的框架听我的键盘?

java jframe jbutton keylistener
1个回答
0
投票

首先,替换这个:

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

你试图稍后摆脱框架,这将使你的应用程序退出。 (这就是关闭的退出方式。)

接下来,替换

f.dispose();

f.setVisible(false);

这将关闭窗口,它将被处理掉。

下一步是让你的窗口工作。我不认为你得到任何关键事件的真正原因是因为下一个问题,但你可以添加。

w.setFocusable(true);
w.requestFocus();

这样你的窗口就会有焦点。

最后,我认为真正的问题是你的run方法。听起来你的游戏循环正在EDT上运行。您可以尝试这个来开始一个新的线程。

public void run() {
    init();

    new Thread( ()-> gameLoop()).start();
}

这应该让你的应用程序运行,这是一个黑客,你应该创建一个SwingWorker,这是一个想法的要点。

© www.soinside.com 2019 - 2024. All rights reserved.