2012-01-25 3 views
0

자바에서 버튼을 사용하여 키보드를 만들고 있는데, 사용자가 A에서 Z로 레이블 된 버튼을 클릭하면 JTextField 텍스트가 A 또는 버튼을 눌렀을 때 어떤 것으로 설정됩니다.비슷한 액션이나 일반적인 액션마다 별도의 ActionListener를 사용해야합니까?

각 버튼마다 별도의 클래스가 있으므로 A는 public class listenser1 implements ActionListener, B는 public class listenser2 implements ActionListener이 좋은 방법입니까?

이 또한 내가 하나 개의 클래스에서 그것을하고 경우에 사용하고 다른 문이

 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 문서 추가 또는 xxx.setText (xxx.getText + event.getActionCommand()) – mKorbel

+0

ActionListener 재사용 +1 – 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); 
} 

(나는 JtextComponent.getText/setText보다는 Document 똑바로가는 것이 좋습니다 것입니다.)

+0

왜 각 버튼에 대한 새로운'ActionListener'을 만들? – MisterEd

+0

@ 미스터 에드 왜 지구상에서 그래? 당신은 이벤트가 어디에서 왔는지에 대한 잘못된 방향을 조사하기위한 해커없이 자급 자족적인 행동을 취합니다. –

+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); 
    } 
관련 문제