2013-07-30 116 views
1

我正在做一些非常基本的編碼,只是試圖學習鍵綁定背後的基本概念。這一切似乎都很直接,但是我的邏輯或結構出現問題,導致我的代碼無法按照我希望的方式執行。使用鍵綁定

這裏是我的代碼

public class Board { 

ButtonListener buttonlistener; 
EnterAction enterAction; 

public Board(){ 

    JFrame skeleton = new JFrame(); 
    skeleton.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    skeleton.setVisible(true); 
    skeleton.setSize(400, 400); 

    buttonlistener = new ButtonListener(); 
    enterAction = new EnterAction(); 

    JPanel panel = new JPanel(); 
    panel.setBackground(Color.BLACK); 

    JButton button = new JButton("button"); 
    button.addActionListener(buttonlistener); 
    panel.add(button); 
    skeleton.add(panel);   
    panel.getInputMap().put(KeyStroke.getKeyStroke("s"), "doEnterAction"); 
    panel.getActionMap().put("doEnterAction", enterAction); 

} 

public class ButtonListener implements ActionListener{ 
    @Override 
    public void actionPerformed(ActionEvent arg0) {  
     System.out.println("button pressed"); 
    }  
} 

public class EnterAction extends AbstractAction{ 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("enter pressed");  
    }  
} 

public static void main(String[] args){ 
    new Board(); 
} 

所以,它應該是非常簡單的。正如你所看到的,我只是試着讓它輸出「enter pressed」,只要你按下回車鍵,但它不會打印出任何東西(除非你點擊上面代碼中顯示的按鈕)。另外,在eclipse中,EnterAction類以黃色下劃線,我認爲它可能不是正確的,但我不知道爲什麼它不會。

任何幫助表示讚賞,謝謝。

+0

那麼,什麼是你在Eclipse中得到警示? – Doorknob

回答

3

眼前的問題,我可以看到的是與下面的語句

panel.getInputMap().put(KeyStroke.getKeyStroke("s"), "doEnterAction"); 

KeyStroke.getKeyStroke("s")會返回null。傳遞給此方法的String的要求非常特別且沒有很好的記錄(恕我直言)。

您可以改爲使用KeyStroke.getKeyStroke("S"),但我更喜歡使用KeyStroke.getKeyStroke(KeyEvent.VK_S, 0),因爲在聲明中不可能有歧義。

我也建議你定義的焦點邊界以及用於輸入地圖...

相反的panel.getInputMap(),請嘗試使用panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW),以確保如果窗口集中

,關鍵事件將被觸發

查看JComponent#getInputMap瞭解更多詳情。

如果您還沒有這樣做的話,你也應該看看How to use Key Bindings

4

變化

panel.getInputMap().put(KeyStroke.getKeyStroke("s"), "doEnterAction"); 

panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("S"), "doEnterAction"); 

而且

skeleton.setDefaultCloseOperation(EXIT_ON_CLOSE);

參數必須是JFrame.EXIT_ON_CLOSE或者只是放數3

+0

*「或者只是把數字3 *」...以及如果常數改變值會發生什麼? – MadProgrammer

+0

@MadProgrammer:簡單地說,發生災難了:) – Azad

2

我認爲Azad和MadProgrammer是正確的,除了他們推薦的程序運行之外,我只需要做一個更簡單的更改。我已經將這三個項目編號爲代碼中的註釋:(複製和粘貼,你很好去)。

import java.awt.Color; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 

public class Board { 

    ButtonListener buttonlistener; 
    EnterAction enterAction; 

    public Board() { 

     JFrame skeleton = new JFrame(); 
     //Change #1 below 
     skeleton.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     skeleton.setVisible(true); 
     skeleton.setSize(400, 400); 

     buttonlistener = new ButtonListener(); 
     enterAction = new EnterAction(); 

     JPanel panel = new JPanel(); 
     panel.setBackground(Color.BLACK); 

     JButton button = new JButton("button"); 
     button.addActionListener(buttonlistener); 
     panel.add(button); 
     skeleton.add(panel); 
     //Change #2 below 
     panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(
       KeyStroke.getKeyStroke("S"), "doEnterAction"); 
     panel.getActionMap().put("doEnterAction", (Action) enterAction); 

    } 

    public class ButtonListener implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      System.out.println("button pressed"); 
     } 
    } 

    public class EnterAction extends AbstractAction { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("enter pressed"); 
     } 
    } 

    public static void main(String[] args) { 
     new Board(); 
    } 
    //Change #3 below 
} 

這裏是截圖: enter image description here