2012-01-25 68 views
0

我創建了一個鍵盤,使用按鈕與java,當用戶點擊從A到Z標記的按鈕時,它會將JTextField文本設置爲A或他們按下的任何按鈕。我應該爲每個類似的動作或通用動作分別使用單獨的ActionListener嗎?

我有一個單獨的類爲每個按鈕,因此對於它的public class listenser1 implements ActionListener,B它的public class listenser2 implements ActionListener是這樣做的一個好方法嗎?

我也試着做做一個類下,如果使用,如果else語句購買使用

 if(a.getText().equals("A")) 
     { 
      input1.setText(input.getText() + "A");  
     } 
     . 
     . 
     . 

這是不行的,它打印出ABCDEFGHIJKLMNOPQRSTUVWXYZ而不只是一個字母。

回答

4

不,這是不是最有效的辦法。寫這個過程太長了。相反,試試這個:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionListener; 

public class Example extends JFrame implements ActionListener { 
    private final String[] letters = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}; 
    private JButton[] buttons = new JButton[26]; 
    private JTextArea text = new JTextArea(); 

    public Example() { 
     super("Example"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     for (int i = 0; i < letters.length; i++) { 
      buttons[i] = new JButton(letters[i]); 
      buttons[i].addActionListener(this); 
      add(buttons[i]); 
     } 
     add(text); 
     pack(); 
     setVisible(true); 
    } 

    public void actionPerformed(ActionEvent event) { 
     text.append(event.getActionCommand()); 
    } 

    public static void main(String[] args) { 
     Example ex = new Example(); 
    } 
} 
+0

+1 add Document或xxx.setText(xxx.getText + event.getActionCommand()) – mKorbel

+0

+1用於重新使用編輯的ActionListener – camickr

+0

@mKorbel。 – fireshadow52

2

我建議爲每個動作創建一個偵聽器實例。匿名內部類可以通過閱讀本地的final進行參數化。

void addButton(final char letter) { 
    JButton button = new JButton(Character.toString(letter)); 
    button.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent event) { 
      input.setText(input.getText() + letter); 
     } 
    }); 
    panel.add(button); 
} 

(我建議直行爲Document而不是JtextComponent.getText/setText

+0

爲什麼每個按鈕創建一個新的'ActionListener'時,只需要一個? – MisterEd

+0

@MisterEd爲什麼地球上不是你?你有一個獨立的行動,沒有任何嘲弄的事情來看錯方向。 –

+0

那麼爲什麼'actionPerformed()'首先傳遞了一個事件,如果引用該事件是「hackery?」 – MisterEd

1

你可以寫一個參數化的聽衆:

private class LetterActionListener implements ActionListener { 

     private final char letter; 

     public LetterActionListener(char letter) { 
      this.letter = letter; 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      input1.setText(input1.getText() + letter); 
     } 

    } 
2

爲什麼你不使用單一類這樣說:

ActionListener commonListener = new ActionListener() { 

    public void actionPerformed(ActionEvent e) { 
     Object o = e.getSource(); 
     if (o instanceof JButton) { 
      JButton button = (JButton)o; 
      String command = (String) button.getActionCommand()(); 
      input1.setText(command); 
     } 
    } 
}; 

您可以將此監聽器添加到您的按鈕:

buttonA = new JButton(); 
buttonA.addActionListener(commonListener); 
buttonA.setActionCommand("A"); // same for others till Z. 

希望這可能會以某種方式幫助你。

1

創建ActionListener一個實例,它在一個循環添加到每個按鈕:

final JTextField input1; 

    ... 

    final ActionListener l = new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      input1.setText(input1.getText() + ((JButton) e.getSource()).getText()); 
     } 
    }; 
    for (char c = 'A'; c <= 'Z'; c++) { 
     final JButton jButton = new JButton(String.valueOf(c)); 
     panel.add(jButton); 
     jButton.addActionListener(l); 
    } 
相關問題