对于我正在制作的游戏,我正在尝试使用播放按钮创建一个简单的标题屏幕,该按钮会在按下后开始游戏。我听说卡片布局最适合这个,但是现在由于某种原因我实现了它,我对游戏的输入被忽略了。这是问题的简化版本,感谢您的帮助。
MainFrame.java
//package panels.examples;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class MainFrame extends JFrame implements ActionListener
{
JPanel headerPanel;
JPanel bodyPanel;
JPanel panel1,panel2;
JButton button1,button2;
Container con;
CardLayout clayout;
public MainFrame()
{
//con=getContentPane();
clayout=new CardLayout();
headerPanel=new JPanel();
bodyPanel=new JPanel(clayout);
button1=new JButton("button1");
button2=new JButton("button2");
//add three buttons to headerPanel
headerPanel.add(button1);
headerPanel.add(button2);
button1.addActionListener(this);
button2.addActionListener(this);
panel1=new JPanel();
panel1.add(new JLabel("Panel1"));
panel1.setBackground(Color.pink);
panel2=new PrizePanel();
panel2.add(new JLabel("Panel2"));
panel2.setBackground(Color.gray);
//add above three panels to bodyPanel
bodyPanel.add(panel1,"one");
bodyPanel.add(panel2,"two");
setLayout(new BorderLayout());
setSize(800,400);
add(headerPanel,BorderLayout.NORTH);
add(bodyPanel,BorderLayout.CENTER);
// headerPanel.setBounds(0,0,600,100);
bodyPanel.setBounds(0,100, 600, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String args[])
{
new MainFrame();
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==button1)
{
clayout.show(bodyPanel, "one");
}
else if(e.getSource()==button2)
{
clayout.show(bodyPanel, "two");
}
}
}
PrizePanel.java
//INCLUDE
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.IOException;
//CLASS
public class PrizePanel extends JPanel {
//DECLARATION
private static final int FRAMEX = 800;
private static final int FRAMEY = 400;
private static final Color BACKGROUND = new Color(204, 204, 204);
private BufferedImage myImage;
private Graphics myBuffer;
private Player pd;
private Timer t;
int points = 0;
//CONSTRUCTOR
public PrizePanel()
{
myImage = new BufferedImage(FRAMEX, FRAMEY, BufferedImage.TYPE_INT_RGB);
myBuffer = myImage.getGraphics();
myBuffer.setColor(BACKGROUND);
myBuffer.fillRect(0, 0, FRAMEX,FRAMEY);
int xPos = (int)(Math.random()*(FRAMEX-100) + 50);
int yPos = (int)(Math.random()*(FRAMEY-100)+ 50);
pd = new Player(150,150,50);
t = new Timer((17), new Listener());
t.start();
addKeyListener(new KeyHandler());
setFocusable(true);
}
//PAINT
public void paintComponent(Graphics g)
{
g.drawImage(myImage, 0, 0, getWidth(), getHeight(), null);
}
//LISTENER
private class Listener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
myBuffer.setColor(BACKGROUND);
myBuffer.fillRect(0,0,FRAMEX,FRAMEY);
pd.move();
pd.draw(myBuffer);
myBuffer.setColor(Color.BLACK);
repaint();
}
}
//MOVE
private class KeyHandler extends KeyAdapter
{
//Ground
public void keyPressed(KeyEvent e){
if(e.getKeyCode() == KeyEvent.VK_LEFT){
pd.setdx(-2);
}
if(e.getKeyCode() == KeyEvent.VK_RIGHT){
pd.setdx(2);
}
if(e.getKeyCode() == KeyEvent.VK_UP){
pd.setY(pd.getY()-1);
pd.setdy(-5.5);
}
}
}
}
答案 0 :(得分:1)
问题不是CardLayout
,问题是使用KeyListener
基本上发生的事情是当你切换布局时,你的组件没有被给予焦点,这意味着你的KeyListener
无法响应键输入。
最简单的解决方案是使用Key Bindings,因为它们允许您定义将引发关键事件的焦点级别。
答案 1 :(得分:1)
添加一行 - panel2
键可以使用:
//LISTENER
private class Listener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
myBuffer.setColor(BACKGROUND);
myBuffer.fillRect(0,0,FRAMEX,FRAMEY);
pd.move();
pd.draw(myBuffer);
myBuffer.setColor(Color.BLACK);
repaint();
requestFocusInWindow();//---->> New line
}
}