切换帧
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,这是这个想法的要点。
我正在尝试通过按钮从一帧切换到另一帧。这是我的第一帧代码:
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,这是这个想法的要点。