2012-07-26 2 views
2

내 Swing 응용 프로그램을 코딩 할 때 항상이 문제가 발생했습니다. 작업 할 때까지 최종적으로 결정적인 답을 얻지 못했습니다.JButton의 ActionListener 내부에서 JFrame에서 JButton을 제거하는 방법?

나는 JFrame을 가지고 있습니다. 이 JFrame 내부에는 JButton이 있습니다. ActionListener에서 JFrame을 거의 비우고 하나 또는 두 개의 구성 요소 (JButton 제거 포함)를 남기고 싶습니다. ActionListener가 완료 될 때까지 구성 요소를 제거 할 수 없기 때문에 응용 프로그램이 정지됩니다. 어떻게해야합니까?

답변

7

구성 요소를 제거 할 때 컨테이너에 validate()repaint()을 호출하는 것을 잊지 마시고 정상적으로 작동해야합니다.

import java.awt.Component; 
import java.awt.Container; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 

public class RemoveDemo { 

    static class RemoveAction extends AbstractAction{ 
     private Container container; 

     public RemoveAction(Container container){ 
      super("Remove me"); 
      this.container = container; 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      container.remove((Component) e.getSource()); 
      container.validate(); 
      container.repaint();  
     } 
    } 

    private static void createAndShowGUI() { 
     final JFrame frame = new JFrame("Demo"); 
     frame.setLayout(new FlowLayout()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     RemoveAction action = new RemoveAction(frame); 
     frame.add(new JButton(action)); 
     frame.add(new JButton(action)); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 
+0

+1 [sscce] (http://sscce.org/). 또한'Action'을 고려하십시오. – trashgod

+0

@trashgod 감사, 액션으로 업데이트되었습니다. – tenorsax

+0

예시. 초기 'invokeLater()'이상을 요구하는 작업 코드는 CPCookieMan (보이지 않는) 코드가 왜 멈추는 지에 대한 질문을 제기합니다. – trashgod

3

사용 EventQueue.invokeLater()는 이벤트 큐에 적절한 Runnable를 추가 할 수 있습니다. 보류중인 모든 이벤트가 처리 된 후 "해당 이벤트가 발생합니다."

+0

예, 좋은 +1 +1 – tenorsax

+1

Max의 예는 나를 쉽게 찾을 수 있도록 해주었습니다. 고마워, 어느 쪽이든. – Paulywog

관련 문제