2012-06-11 40 views
1

在下面的程序,我试图改变基于按下的键标签的文字,但我不知道如何做到这一点。在按下键时要执行的语句在TimerListener InnerClass的actionPerformed()方法中定义。但我不明白我如何从那里访问标签。更改标签文本按下

package aircraftPackage; 

import java.awt.*; 
import java.awt.event.*; 
import java.awt.geom.AffineTransform; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import java.net.*; 
import java.util.HashMap; 
import java.util.Map; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

public class Controller extends JPanel { 

    private static final long serialVersionUID = 1L; 
    public static final int STEP = 3; 
    private static final int TIMER_DELAY = STEP * 8; 
    private BufferedImage playerImage = null; 
    private Map<Direction, Boolean> directionMap = new HashMap<Direction, Boolean>(); 



    enum Direction { 

     UP(KeyEvent.VK_UP, 0, -1), DOWN(KeyEvent.VK_DOWN, 0, 1), 
     LEFT(KeyEvent.VK_LEFT, -1, 0), RIGHT(KeyEvent.VK_RIGHT, 1, 0); 
     private int keyCode; 
     private int xDirection; 
     private int yDirection; 

     private Direction(int keyCode, int xDirection, int yDirection) { 
      this.keyCode = keyCode; 
      this.xDirection = xDirection; 
      this.yDirection = yDirection; 
     } 

     public int getKeyCode() { 
      return keyCode; 
     } 

     public int getXDirection() { 
      return xDirection; 
     } 

     public int getYDirection() { 
      return yDirection; 
     } 
    } 

    public Controller() { 

     for (Direction direction : Direction.values()) { 
      directionMap.put(direction, false); 
     } 
     setKeyBindings(); 
     Timer timer = new Timer(TIMER_DELAY, new TimerListener()); 
     timer.start(); 
    } 

    private void setKeyBindings() { 
     InputMap inMap = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 
     ActionMap actMap = getActionMap(); 
     for (final Direction direction : Direction.values()) { 
      KeyStroke pressed = KeyStroke.getKeyStroke(direction.getKeyCode(), 0, false); 
      KeyStroke released = KeyStroke.getKeyStroke(direction.getKeyCode(), 0, true); 
      inMap.put(pressed, direction.toString() + "pressed"); 
      inMap.put(released, direction.toString() + "released"); 
      actMap.put(direction.toString() + "pressed", new AbstractAction() { 

       private static final long serialVersionUID = 1L; 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        directionMap.put(direction, true); 
       } 
      }); 
      actMap.put(direction.toString() + "released", new AbstractAction() { 

       private static final long serialVersionUID = 1L; 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        directionMap.put(direction, false); 
       } 
      }); 
     } 

    } 



    private class TimerListener implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      boolean moved = false; 
      for (Direction direction : Direction.values()) { 
       if (directionMap.get(direction)) { 
        if (direction.keyCode == 37) { 
         System.out.println("go LEFT"); 

        } else if (direction.getKeyCode() == 39) { 
         System.out.println("go RIGHT"); 
        } else if (direction.getKeyCode() == 38) { 
         System.out.println("go UP"); 
        } 
        else if (direction.getKeyCode()==40){ 
         System.out.println("go DOWN"); 
        } 
       } 
      } 
     } 
    } 

    public static void createAndShowUI() { 
     JFrame frame = new JFrame("MoveIcon"); 
     JPanel panel = new JPanel(); 
     JLabel jl = new JLabel(); 
     jl.setText("testing...."); 
     frame.add(jl); 
     frame.add(panel); 
     frame.getContentPane().add(new Controller()); 
     new Controller(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 

    } 

    public static void main(String[] args) { 

     java.awt.EventQueue.invokeLater(new Runnable() { 

      @Override 
      @SuppressWarnings("static-access") 
      public void run() { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 

其实,我想要做的是,创造一个很好的形式,将包含在Netbeans的(它更容易做到这一点那里),并使用上面的代码只知道被按下哪个键和各种标签相应地更改每个标签的值。 我试过了,但它没有奏效。 请帮助我。 谢谢。

PS你会在某些问题或某些网站上发现上述代码的部分,因为我没有自己写过。我没有任何keybindings/keyListeners等经验。这只是我正在做的一个项目的一部分。

+1

代码中没有'ad'和'jLabel1'定义。他们在哪?另外,为什么你要创建两个'Controller'(一个被添加到JFrame中)? –

+1

该代码看起来非常眼熟...... –

+1

是啊,类似我以前的StackOverflow的答案[这里](http://stackoverflow.com/a/8961998/522444)。 –

回答

3

我试图删除你不马上需要的一切,并且加入了JLabel,显示这样的指示:

go go UP go UP DOWN LEFT RIGHT


这应该让你开始。

import java.awt.event.*; 
import java.util.HashMap; 
import java.util.Map; 
import javax.swing.*; 

public class Controller extends JPanel { 

    private static final long serialVersionUID = 1L; 
    private static final int STEP = 3; 
    private static final int TIMER_DELAY = STEP * 8; 
    private Map<Direction, Boolean> directionMap = new HashMap<Direction, Boolean>(); 

    private JLabel lblDirection = new JLabel(); 

    enum Direction { 

     UP(KeyEvent.VK_UP), DOWN(KeyEvent.VK_DOWN), 
     LEFT(KeyEvent.VK_LEFT), RIGHT(KeyEvent.VK_RIGHT); 

     private int keyCode; 

     private Direction(int keyCode) { 
      this.keyCode = keyCode; 
     } 

     public int getKeyCode() { 
      return keyCode; 
     } 
    } 

    public Controller() { 

     add(lblDirection); 

     for (Direction direction : Direction.values()) { 
      directionMap.put(direction, false); 
     } 
     setKeyBindings(); 
     Timer timer = new Timer(TIMER_DELAY, new TimerListener()); 
     timer.start(); 
    } 

    private void setKeyBindings() { 
     InputMap inMap = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 
     ActionMap actMap = getActionMap(); 
     for (final Direction direction : Direction.values()) { 
      KeyStroke pressed = KeyStroke.getKeyStroke(direction.getKeyCode(), 0, false); 
      KeyStroke released = KeyStroke.getKeyStroke(direction.getKeyCode(), 0, true); 
      inMap.put(pressed, direction.toString() + "pressed"); 
      inMap.put(released, direction.toString() + "released"); 
      actMap.put(direction.toString() + "pressed", new AbstractAction() { 

       private static final long serialVersionUID = 1L; 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        directionMap.put(direction, true); 
       } 
      }); 
      actMap.put(direction.toString() + "released", new AbstractAction() { 

       private static final long serialVersionUID = 1L; 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        directionMap.put(direction, false); 
       } 
      }); 
     } 
    } 

    private class TimerListener implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      StringBuilder s = new StringBuilder("go "); 
      for (Direction direction : Direction.values()) { 
       if (directionMap.get(direction)) { 
        s.append(direction.name() + " "); 
       } 
      } 
      lblDirection.setText(s.toString()); 
     } 
    } 

    public static void createAndShowUI() { 
     JFrame frame = new JFrame("KeyMapping"); 
     frame.getContentPane().add(new Controller()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(400, 80); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       createAndShowUI(); 
      } 
     }); 
    } 
}