2016-08-07 6 views
0

그래서 while 루프를 여는 버튼이 있고, while 루프가 끝날 때까지 전체 GUI가 멈추고, 그걸로 내 GUI를 매초마다 업데이트 할 수있는 스레드가 어떻게 생겼겠습니까? 스윙 객체는 스레드로부터 안전하지 않습니다 그래서 당신이 시간에 어떤 나중에에서 실행되는 작업을 할 수 있습니다 SwingUtilities.invokeLater(), 제공하고 있기 때문에 분명Java GUI를 쓰는 방법

JButton Test= new JButton(); 
Test.setText("Test"); 
Test.setSize(230, 40); 
Test.setVisible(true); 
Test.setLocation(15, 290); 

Test.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e){ 
int x = 0; 
while(x<500){ 
    x++ 
}); 
+0

이 – whyn0t

+0

일반적인 자바 명칭 (이름 지정 규칙을 배울 바랍니다 https://docs.oracle.com/javase/tutorial/uiswing/concurrency/ - 예를'EachWordUpperCaseClass'이,'firstWordLowerCaseMethod()','firstWordLowerCaseAttribute'는 그것이하지 않는 한 'UPPER_CASE_CONSTANT') 일관되게 사용하십시오. –

답변

1

사용 ExecutorService 클래스

Test.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      ExecutorService es = Executors.newCachedThreadPool(); 
      es.submit(new Runnable() { 
       @Override 
       public void run() { 
        int x = 0; 
        while (x < 500) { 
         x++; 
        } 
       } 
      }); 
     } 
}); 
+1

* "어떻게 매 초마다 GUI를 업데이트 할 수 있습니까?"* 질문을하는 사람이 제공 한 예제 코드는 '무거워 짐'루프에서 완전히 업데이트하지 못했습니다. GUI! 그렇게하려면 'GUI 업데이트'를 수행하려면 EDT에서 수행해야하지만 무거운 작업 자체는 EDT에서 수행되어야합니다. 가장 최적의 대답은'SwingWorker'를 사용하도록 제안한 [this one] (http://stackoverflow.com/a/38813650/418556)입니다. 작업자는 EDT 코드를 모두 처리합니다. –

+1

@AndrewThompson 맞아, 좋은 관찰이야. – avonnadozie

2

.

javax.swing.SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     int x = 0; 
     while(x<500){ 
      x++ 
     } 
    } 
}); 
3

큰 아이디어가 GUI를 그리기의 책임 스레드에서 무거운 치료를하고 있습니다 때문에 GUI가 정지이다; 해결책은 계산을 위임하거나 백그라운드에서 실행될 스레드에 시간을 할애 할 수있는 모든 처리를 위임하는 것입니다. https://docs.oracle.com/javase/tutorial/uiswing/concurrency/