문제

이름이없는 JButton의 액션 리스너를 구현할 수있는 방법이 있는지 궁금합니다. 예를 들어, 알파벳의 각 문자에 대한 버튼을 만드는 루프에 대한 다음과 같은 경우가 있습니다.

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

루프를 제거하고 각 JBUTTON의 하드 코딩을 제거한 다음 각 버튼에 대한 액션 리스너를 추가 할 수있는 방법이 있습니까?

미리 감사드립니다.

토메

도움이 되었습니까?

해결책

당신의 질문은 조금 모호합니다. 루프 내부에 리스너를 추가하기 위해 루프를 수정하는 것은 사소한 일입니다.

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)를 사용하여 수행 할 수 있습니다.

다른 팁

이 작업의 문제는 무엇입니까?

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);

이름이 지정되면 즉각적인 방법의 로컬 변수에 버튼 인스턴스를 저장하는 것 같습니다. 이를 피하려고 시도하면 코드를 읽기가 더 어려워 질 수 있습니다. 그러나 귀하의 질문에 답하기 위해 :

가장 분명한 방법은 오래되었지만 새롭게 인기있는 이중 브레이스 관용구를 사용하는 것입니다.

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

이 경우 최종적이지 않으므로 익명의 내부 클래스에서 사용할 수 없습니다. 다른 (최종) 변수에 할당하거나 루프를 재구성하십시오.

또 다른 경로는 행동을 통해가는 것입니다. (보통 나는 가난한 사람의 해시 가능이기 때문에 행동을 피하는 것이 좋습니다. 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) {
            ...
        }
    });
}

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

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

그러나 익명의 jbutton을 패널에 추가하려고하는 경우 다음과 같이 JBUTTON의 생성자 대신에 addActionListener 메소드 (void)의 반환 유형이 사용 되므로이 접근법은 작동하지 않습니다.

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             
                    }           
                }));
        }

위의 코드는 Panel.add () 메소드에 대한 잘못된 인수에 대해 불평합니다.

따라서 귀하의 경우 Jbutton의 이름이 지정된 인스턴스를 만들어야합니다.

이것이 명확 해지기를 바랍니다.

안부, 수레 쉬

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top