2017-09-09 3 views
1

KeyEventsを使ってImageIconを移動しようとすると、なぜ動作しないのか分かりません。私がしたい、 "A"キーを押すと、私のイメージを左に動かす。ActionEvent - KeyEventに問題がありますか?

これは、ヘルパーにより研磨し、私のコードです:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 


public class MainClass extends AbstractAction { 
    JLabel label; 

    int x = 300; 
    int y = 300; 

    public MainClass() { 
     final JPanel panel = new JPanel(); 
     final ImageIcon image = new ImageIcon("Character Face Left - Bronze.png"); 

     label = new JLabel(image,JLabel.CENTER); 

     label.setSize(500,500); 
     label.setLocation(x, y); 

     final JFrame frame = new JFrame("Rover: Bound to Earth"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLayout(null); 
     frame.add(label); 
     frame.setSize(500, 500); 
     frame.setVisible(true); 

     InputMap inputMap = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 
     ActionMap actionMap = panel.getActionMap(); 

     inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0), "LEFT"); 
     actionMap.put("LEFT", this); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     x -= 10; 
     label.setLocation(x, y); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { new MainClass(); }); 
    } 
} 

答えて

2
InputMap inputMap = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 
    ActionMap actionMap = panel.getActionMap(); 

あなたがパネルにキーバインドを追加していますが、パネルを使用することはありません。

キーバインディングを使用して、操作したいコンポーネントを追加する必要があります。

InputMap inputMap = label.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); 
    ActionMap actionMap = label.getActionMap(); 

それとも、あなたが本当にパネルでバインディングを設定したい場合は、パネルにラベルを追加する必要がありますし、フレームをパネルに追加します。したがって、フレームはデフォルトのBorderLayoutを使用し、パネルはnullレイアウトを使用します。

がランダムにコンポーネントのサイズを設定しないでください:

label.setSize(500,500); 

を代わりにあなたが推奨サイズ上のサイズをベースに:また

label.setSize(label.getPreferredSize()); 

、なぜあなたはAbstracActionを拡張していますか?

public class MainClass extends AbstractAction { 

このクラスのコードはGUIを作成するために使用されますが、このためにAbstractActionを拡張しないでください。

How to Use ActionsのSwingチュートリアルのセクションを読んでください。 ActionDemo.javaソースコードは、コードの構造をより良くし、アクションを別の内部クラスとして使用する方法を示します。

0

このコード試してみてください(それぞれ左矢印画像、右矢印画像は、Base64形式でコードに埋め込まれている):

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.util.Base64; 

public class MainClass extends JFrame { 

    private static final String LEFT_ARROW = "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAbsAAAG7AEedTg1AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAVNQTFRF////AAAAAAAAVVVVQEBAMzMzKysrJCQkQEBAYGBgLi4uKysrNzc3SUlJMzMzLS0tNjY2aGhoQ0NDMzMzNzc3MzMzPDw8MjIyXFxcNzc3TExMNTU1XV1dZWVlMTExampqPDw8ZmZmSkpKNDQ0Xl5eQUFBPDw8VFRUaGhoQUFBOzs7SkpKYWFhR0dHREREWFhYampqR0dHQUFBUVFRZWVlSEhIUVFRXV1dbm5uSkpKUFBQWFhYaGhoUFBQWFhYZGRkdHR0UlJSWFhYXl5eb29vWVlZYWFhbGxseXl5W1tbY2Njd3d3ZmZmbW1tdXV1gICAZ2dnb29vh4eHf39/cnJyfX19h4eHc3Nzenp6h4eHj4+PfHx8hoaGjo6Ofn5+hYWFjo6OlZWVfHx8goKChoaGiIiIioqKjIyMjo6OkJCQkpKSk5OTlJSUlpaWl5eXmJiYmZmZ40GS6gAAAGJ0Uk5TAAECAwQFBgcICAsMDg4PERMWFxkcHiIkJC4vMDQ1OTo8PD5AQUtNT1ZeX2BkcHF0e4SFh4uYmJyiqqqusbu8wMbLy87R19jc4eLj6Ovs7vHy8vT19/j5+vv7/P39/f7+/v7HrT76AAABKUlEQVRYw+3XxVIDQQCE4YYQCBAI7hbcHYJbcPfgDoENw/T7n3Ldwy4F1Reoyn+e/mpuUwNk+hc1ifvehLYffTbKPGf6jQoQXnaoABVbhgpQf2ipAJ0JUgEG76gAWROvVIDQ/AcVoGTNUAGqdy1dQJt3Id99yynd2SfvGvz2Pdf8UVGf/cgLFSAw804FKFz5pAKUb1sqQO0RqQAdF5SAgXtKwGSSCpC7kKICRNYtFaByj7+v2QUUxA2lGyAw62gAMJYUAfTdiABaz0QAVfsigOINqwEILhoNAGKOCGDoQQTQdSkCqDsRAZTtiADyVt0HTdS7/O8e9zntcQUwnhIB9N+KANrPRQA1ByKAok0RQPaSCABTXyKA4UcRQPeVCKDxWP3ylGZ+fX++NPvqVHl2jq5HAAAAAElFTkSuQmCC"; 
    private static final String RIGHT_ARROW = "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAADzklEQVR4Xu2bX0jaaxjHX/8s+2NIQnFOjqYyi7YMbFLSzMqyYrk2DiWMbvbnMOjAgg1h29W2mwOHwc6hiLStdoi2RuDO8aJdNMvWoX8rDTMPTpsEugRZJqyGJup5vPCuiyNkSI9fePndKe+X930/z+/7vD9KLBYjmEUlyJUxIGMAcmUMyBhwzKqpqeFVV1f/gNYAmLyyoqLCVlVVdQ6lARQKhSaRSNhSqdQMq0GOlgKwChhNTU3vZTLZz2gpwOVyqa2trc8VCsVTtBQoLCwkbW1taqVS+bdYLD6FEoP5+flxE67weLxlMIGFsg7IysoicCaIgBD/ggklKAshKpVKamtri4ESNhgX0FaClZWVzIaGhiUgxFW0pTCfz6e3tLS8BVSq0eYBRUVFFCDEUyDECwqIpEB0cohg/52ORCJnSQpUXl6e1O+yWCwCtcKt3NxcfmNj4yWj0RhMuQFCofARuJ+SCi07O5skKwaDQRpBi4uLFiDExdXV1a/kiHRoKKpWq/8qLS29StJQa2tr/qWlJQk8nSjzAJFIxG5ubrbW19fL0AYiAoGAATvCCJS4jjYRKi4upgIiX7a3t/+KNhIrKCggsAoednV16VQqFQ1lJpiTk0PkcvlP8C7xETIGJspQlEajkbq6uipImeyAyR9RpsLxQhFyRg7QwQEpUyXaWLysrIwJhDDBAXkZbV+Aw+HQIWbTd3R03EXbGGGz2RRYCc86Ozu1aDtDeXl5BEy43d3dbYhjEmVrLBgMxodpYmIigs6AnZ2d6MzMzE2dTncf3RbweDwhyA7kk5OTL9FRwOl0Bqanp89PTU19QEWBeLaxvr7uMhgMvPn5+c//LxE6IYIIj5jN5n8gKGmCESYgNAaEQiGysrLy5+jo6A10L0P7+/uxhYWFB4nJozLA7/dHYPKd4+Pjv5FDdKK3wPb29nfY61K9Xr+GLhFyuVw+KHDOJiaPyoCNjQ3b8vLymbm5OW8KGiPpq2g0SiwWyzuNRqOMgVLaGOnp6eHAH/JICsRkMlUQWtwhSejg4CBe4Pw+NDR071h6g4ODg1/gAePo1dvbK04Wc3DY/QKY06DrDu/u7oZNJpMiMXlUBni93m8weeHY2Ng0uvsBW1tbntnZ2RIIMT6huyHicDhWNjc3ufAuHyDHIHo6Yc5ms73p7++/hu6aXDgcJlar9Uli8qgMAMxFgfHdAwMDj9FdlQ0EAiEobaVarfY1urvCPp/Pb7fbBcPDw4vobou73e7PcNqXjIyMuEkSOhEU2Nvbe9XX1/cHSRNlPp0lyJUxIGMAcv0HB8VtSN5KVe4AAAAASUVORK5CYII="; 
    private JLabel label; 
    private ImageIcon leftArrow; 
    private ImageIcon rightArrow; 

    MainClass() { 
     loadResources(); 
     buildUI(); 
     registerListeners(); 
    } 

    private void loadResources() { 
     leftArrow = new ImageIcon(Base64.getDecoder().decode(LEFT_ARROW)); 
     rightArrow = new ImageIcon(Base64.getDecoder().decode(RIGHT_ARROW)); 
    } 

    private void buildUI() { 
     label = new JLabel("test"); 
     label.setIcon(leftArrow); 
     label.setSize(100, 64); 
     label.setOpaque(true); 
     label.setBackground(Color.CYAN); 
     label.setLocation(0, 0); 

     JPanel panel = new JPanel(); 
     panel.setOpaque(true); 
     panel.setLayout(null); 
     panel.add(label); 

     this.setContentPane(panel); 
    } 

    private void registerListeners() { 
     this.addKeyListener(new KeyAdapter() { 

      @Override 
      public void keyPressed(KeyEvent e) { 
       int x = 0; 
       int y = 0; 
       ImageIcon newImageIcon = null; 
       switch (e.getKeyCode()) { 
        case KeyEvent.VK_LEFT: 
         newImageIcon = leftArrow; 
         x -= 10; 
         break; 
        case KeyEvent.VK_RIGHT: 
         newImageIcon = rightArrow; 
         x += 10; 
         break; 
        case KeyEvent.VK_UP: 
         y -= 10; 
         break; 
        case KeyEvent.VK_DOWN: 
         y += 10; 
         break; 
       } 
       if (x != 0 || y != 0) { 
        Point location = label.getLocation(); 
        label.setLocation(location.x + x, location.y + y); 
        if (newImageIcon != null) { 
         label.setIcon(newImageIcon); 
        } 
       } 
      } 

     }); 
    } 

    public static void main(String[] args) { 
     JFrame frame = new MainClass(); 
     frame.setSize(500, 500); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 
+0

だから、あなたのコードで、どのように私は、画像を変更するのでしょうか?例えば、 "LEFT"キーを押すと、この画像を持っています: ImageIcon characterLeft = new ImageIcon( "Character Face Left.png"); "RIGHT"キーを押すと、この画像に切り替える必要があります。 ImageIcon characterRight = new ImageIcon( "Character Face Right.png"); –

+0

押されたキーに基づいてラベルイメージを変更する方法を示すコードを更新しました。 –

+0

KeyListenerを使用しないでください。これはAWTの古いソリューションです。 Swingの "Key Bindings"ソリューションは、より新しい、より良いソリューションです。新しいAPIが利用可能になったらそれを使用します。私の答えで提供したチュートリアルのリンクを読んでください。また、 'Key Bindingsの使い方'のセクションもあります。 – camickr