2008-11-11 4 views
0

이름없는 Jbutton에 대한 동작 수신기를 구현하는 방법이 있는지 궁금합니다. 예를 들어, 알파벳의 각 문자에 대한 버튼을 만드는 다음 for 루프가 있습니다.이름없는 JButton을위한 Java actionListener?

for (int i = 65; i < 91; i++){ 
    alphabetPanel.add(new JButton("<html><center>" + (char)i)); 
} 

나는 각각에 대한 액션 청취자를 만드는 각 JButton의 코딩 및 루프 내 제거하고 하드받지 않고 그 각각의 버튼에 대한 액션 청취자를 추가 할 수있는 방법이 있나요? 사전에

감사합니다,

메크

답변

4

귀하의 질문이 좀 모호합니다. 루프 내부의 리스너를 추가하는 루프를 수정하는 사소한 것 :

ActionListener listener = something; 

for (int i = 65; i < 91; i++){ 
    JButton button = new JButton("<html><center>" + (char)i); 
    button.addActionListener(listener); 
    alphabetPanel.add(button); 
} 

당신은 패널의 모든 자식을 반복 할 수있는 루프를 수정하고, 아이들의에 리스너를 추가 할 수없는 경우 그 jbuttons입니다.

왜 텍스트를 가운데 맞추기 위해 html을 사용하고 있습니까? 그 잔인하지 않니? 이미 가운데 텍스트를 jbutton하지 않습니까?
setHorizontalAlignement (SwingConstants.CENTER)를 사용하여이 작업을 수행 할 수도 있습니다.

+0

에 대한 내가 생각한 어떤 이유로 동작 리스너가 작동하는 것은 그것이 만들어진 후에 동작이 수행 될 때까지 코드에서 멈춘다는 것이지만, 그 동작의 전체 목적을 상실한 것 같다. 나는 그것을 바 꾸었고 내가 원했던 것과 똑같이 작동했다. 감사! P. html은 과잉이었다. – Tomek

2

이 문제는 무엇입니까?

for (int i = 65; i < 91; i++){ 
    JButton button = new JButton("<html><center>" + (char)i)); 
    button.addActionListener(new ButtonListener()); 
    alphabetPanel.add(button); 
} 

... 또한

class ButtonListener implements ActionListener { 
    ButtonListener() { 
    } 
    public void actionPerformed(ActionEvent e) { 
     //TODO: 
    } 
} 

, 버튼의 텍스트는 알파벳의 문자로 버튼의 이름을 설정할 수있는 버튼을 식별하지 않는 경우.

button.setName((char)i)); // or button.setName(i); 
0

은 아래와 같은 익명의 구성 요소에 ActionListener를 추가 할 수 있습니다 :

new JButton().addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       // TODO your action    
      }   
     }); 

그러나, 귀하의 경우는이 방법이 있기 때문에 작동하지 않습니다 귀하의 패널에 익명의 JButton를 추가 할 경우

for (int i = 65; i < 91; i++){ 
      alphabetPanel.add(new JButton("<html><center>" + (char)i).addActionListener(new ActionListener(){ 
        @Override 
        public void actionPerformed(ActionEvent arg0) { 
         // TODO your action    
        }   
       })); 
     } 

위의 코드는 FO에 대한 잘못된 인수를 불평 : 아래 그림과 같이 (무효) addActionListener에 방법의 반환 형식의 JButton의 생성자 대신 이동합니다 r panel.add() 메소드.

그래서 귀하의 경우 JButton의 명명 된 인스턴스를 만들어야합니다.

희망 사항을 명확히합니다. 이름으로

최고 감사합니다, 수레 쉬

1

, 당신은 즉시 방법의 지역 변수에 버튼 인스턴스를 저장 의미하는 것 같다. 이것을 피하려고하면 코드를 읽기가 어려워 질 수 있습니다. 그러나 귀하의 질문에 대한 답변 :

가장 확실한 방법은 이전이지만 새로 인기있는 이중 중괄호 관용구를 사용하는 것입니다.

alphabetPanel.add(new JButton("<html><center>" + (char)i) {{ 
    addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent event) { 
      ... 
     } 
    }); 
}}); 

참고로,이 경우 최종본이 아니기 때문에 익명의 내부 클래스에서 사용할 수 없습니다. 다른 변수 (최종 변수)에 할당하거나 루프를 재구성하십시오.

다른 경로는 액션을 거쳐야합니다. (그들은 가난한 사람의 해시 테이블을 jsut대로 보통 나는 작업을 피하는 게 좋을 것 ButtonModel에 그래도 "좋은"입니다..)

alphabetPanel.add(new JButton(new AbstractAction("<html><center>" + (char)i) { 
    public void actionPerformed(ActionEvent event) { 
     ... 
    } 
})); 

그런 다음 물론 응용 프로그램 특정 라이브러리 방법이있다 :

Form alphabetForm = new Form(alphabetPanel); 
for (char c='A'; c <= 'Z'; ++c) { 
    alphabetForm.button("<html><center>" + c, new ActionListener() { 
     public void actionPerformed(ActionEvent event) { 
      ... 
     } 
    }); 
} 
관련 문제