CardLayout输入问题Java

时间:2014-01-31 06:53:44

标签: java swing jframe jpanel

对于我正在制作的游戏,我正在尝试使用播放按钮创建一个简单的标题屏幕,该按钮会在按下后开始游戏。我听说卡片布局最适合这个,但是现在由于某种原因我实现了它,我对游戏的输入被忽略了。这是问题的简化版本,感谢您的帮助。

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



   }
}
}

2 个答案:

答案 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
      }
   }