切换帧

Switching Frame

我正在尝试通过按钮从一帧切换到另一帧。这是我的第一帧代码:

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();

        }
    });

和主程序:

//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;
}

但是当主程序的框架在屏幕上时,即使我已经添加了键盘监听器,它也不会监听我的键盘。是不是第一帧只处理了没有关闭?有没有办法关闭它或者让我的框架听我的键盘?

首先,替换这个:

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

您稍后尝试摆脱框架,这会使您的应用程序退出。 (这就是关闭时退出的意思。)

下一步,替换

f.dispose();

f.setVisible(false);

这将关闭 window,它会被处理掉。

下一步是让您的 window 发挥作用。我认为您没有收到任何关键事件的真正原因是下一个问题,但您可以添加。

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

这样你的 window 就会有焦点。

最后,我认为真正的问题是您的 运行 方法。听起来您的游戏循环在美国东部时间 运行ning。你可以试试这个来开始一个新线程。

public void run() {
    init();

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

那应该让你的应用程序 运行ning,这有点 hack,你应该创建一个 SwingWorker,这是这个想法的要点。