2013-03-17 3 views
2

문제는 : 나는 스윙 응용 프로그램이 있습니다. 2 btns ("시작", "중지")와 함께 하나의 양식. 이 btns에서 스레드 클래스가있는 ActionListener를 내부에 추가했습니다.자바 스윙 다중 스레드

새 스레드에서 시작하려면 btn "시작"을 클릭하고 btn "정지"를 클릭하면 해당 작업이 종료됩니다. 이 코드는 콘솔에서 잘 작동하지만 스윙 doest에서는 비슷합니다. 어떤 도움을 주셔서 감사합니다. 미리 감사드립니다.)

class Action implements ActionListener{ 
     class MyThread extends Thread{ 
      boolean live = true; 

      @Override 
      public void run() {    
       while(live) 
        System.out.println("doing..."); 
      }    

       public void shutDown(){ 
       live = false; 
      } 
     } 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      JButton source = (JButton) e.getSource(); 
      MyThread t = new MyThread(); 
      switch (source.getText()) { 
      case "Start": 
        t.start(); 
        break; 
      case "Stop": 
        t.shutDown(); 
        break; 
    } 

그리고 간단한 양식

public class App extends JFrame { 
     public static void main(String[] args) { 
      App app = new App(); 
      app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      app.setVisible(true); 

      JButton btn1 = new JButton("Start"); 
      JButton btn2 = new JButton("Stop"); 

      app.getContentPane().add(btn1, BorderLayout.WEST); 
      app.getContentPane().add(btn2, BorderLayout.EAST); 

      Action action = new Action(); 

      btn1.addActionListener(action); 
      btn2.addActionListener(action); 
     } 

    } 
+1

live는 volatile로 선언하는 것이 좋습니다. –

답변

2

당신은 새로운 Thread 객체에게 단추를 클릭 할 때마다 만드는, 그래서 당신은 중지 스레드가 당신이 시작 같은 것이 아니다. 나중에 다시 중지 할 수 있도록 시작시 작성한 스레드에 대한 참조를 유지해야합니다.

+0

오, 세상에))) 무슨 실수 ...))) 정말 고마워요!) 나는이 실수가 매우 어리 석다는 이유로, 휴식이 필요해 보인다))) – yvoytovych