2012-08-10 2 views
1

플래시 효과를 내고 싶습니다. (JTextArea의) 배경색을 RED로 변경 한 다음 1 초간 기다린 후 → WHITE로 돌아갑니다. I는 다음과 같이 수행Swing에서 플래시 효과를 만들려면 Thread.sleep() 및 setBackground()를 사용하는 방법?

JTextArea jTextArea = new JTextArea(); 
jTextArea.setBackGround(Color.RED); 
Thread.currentThread().sleep(1000); 
jTextArea.setBackGround(Color.WHITE) 

그러나이 작동하지 않습니다, 나는 흰색 배경입니다 가지고있는 모든, 나는 빨간 하나를 볼 수 없습니다.

무엇이 잘못 되었나요?

감사합니다.

답변

1

그 스레드가 1 초 동안 잠자기하고 싶기 때문에 GUI 스레드가 아닙니다. Swing.Utilities에는 SwingUtilities.invokeLater() 메서드가 있다고 생각합니다. 대신 당신의 GUI를 고정 할 수 있습니다 Thread.sleep(...)을 사용

public void class Flash extends Thread { 
    JTextArea jtextArea = new JTextArera(); 
    public void run() { 
    SwingUtilities.invokeLater(new Runnable()) { 
     jTextArea.setBackground(Color.WHITE); 
    } 
    } 
} 

public void class Main { 
    public void main() { 
     ... 
     Flash fl = new Flash(); 
     fl.start(); 
    } 
} 
+0

고마워, 내 질문에 바로 대답한다. –

4

, 당신은 javax.swing.Timer를 사용한다. 또한 @MinhCatVO에 의해 매우 많이 언급 되었 듯이, GUI에 대한 모든 업데이트는 EDT에서 수행되어야합니다. 자세한 내용은 Concurrency in Swing을 참조하십시오. 아래 코드를보고 무엇이 당신의 이해를 초월하는지 물어보십시오.

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class ColouringTextArea 
{ 
    private JTextArea tarea; 
    private Timer timer; 
    private Color[] colours = { 
           Color.RED, 
           Color.BLUE, 
           Color.GREEN.darker(), 
           Color.DARK_GRAY, 
           Color.MAGENTA, 
           Color.YELLOW 
           }; 
    private int counter = 0;       
    private ActionListener timerAction = new ActionListener() 
    { 
     public void actionPerformed(ActionEvent ae) 
     { 
      if (counter < colours.length) 
      { 
       tarea.setBackground(colours[counter]); 
       counter++; 
      } 
      else 
      { 
       tarea.setBackground(Color.PINK); 
       counter = 0; 
      } 
     } 
    }; 

    private void displayGUI() 
    { 
     JFrame frame = new JFrame("Colouring JTextArea"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel contentPane = new JPanel(); 
     tarea = new JTextArea(10, 10); 
     contentPane.add(tarea); 

     frame.setContentPane(contentPane); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 

     timer = new Timer(1000, timerAction); 
     timer.start(); 
    } 

    public static void main(String... args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new ColouringTextArea().displayGUI(); 
      } 
     }); 
    } 
} 
+0

감사합니다. 귀하의 코드에 대해 더 이상의 질문이 없습니다. 시간 내 줘서 고마워. –

+0

@ user1525788 : 당신은 가장 환영 받고 있습니다. :-) 우리는 모두 서로 돕기 위해 여기에 있습니다. 그래서 그 부분에 대한 시간은 절대로 짧지 않습니다 :-) –

1

스레딩 문제로 인해 작동하지 않습니다. Worker Thread이 필요합니다.

이 작동합니다 : 스윙 객체에 대한 모든 메소드가 이벤트 발송 쓰레드에서 호출해야한다는

  SwingWorker<Object, Object> sw = new SwingWorker<Object, Object>() { 
       @Override 
       protected Object doInBackground() throws Exception { 
        SwingUtilities.invokeLater(new Runnable() { 
         @Override 
         public void run() { 
          jTextArea.setBackground(Color.RED); 
         } 
        }); 
        Thread.sleep(1000); 
        SwingUtilities.invokeLater(new Runnable() { 
         @Override 
         public void run() { 
          jTextArea.setBackground(Color.WHITE); 
         } 
        }); 
        return null; 
       } 
      }; 

      sw.execute(); 

참고. 이를 수행하려면 다음 패턴을 사용하십시오.

SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      // Do gui things 
     } 
    }); 

이벤트 디스패처 스레드에 대해 자세히 알아보십시오. 이것에 관해서는 너무 많은 게시물이 있습니다. 단어를 검색하면됩니다.

+0

'SwingWorker'는'Background tasks'를 오랫동안 실행하기위한 것입니다. JComponent '의'Colour '를 변경하는 것과 같은 작은 일을 위해서. –

+0

@Gagandeep : 글쎄, 나는 이것에 대한 전문가가 아니다. 하지만 달리 작동하게 만들 수는 없었습니다. 도울 수 있니? – Mohayemin

+0

오, 이미 게시했습니다. :) – Mohayemin