자바,Swing 왜 안바뀌죠?
망고
버튼을 눌러 어떤 동작중일때이내용의상태를J레이블에표시할려고 합니다.
상태표시줄처럼...
근데 동작이 완전히 끝날때까지 바뀌지가 않네요..
아니면 쓰레드를 써야하는지...
레이블에 reload(), setVisible() 이런 함수를 찾아봐서 했는데 안되구요..
아니면 레이블 객체 자체를 새로 만들어서 add해야할지...
g.repaint같은 걸 쓸려면 어떻게 해야할지...
패인이나 프레임같은컨테이너 수준에서 reload(), setVisible() 같은 동작을 해야 하는지...
소스는 간단하지만 올려보겠습니다..
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/************************************************************
버튼눌렀을때 라벨을 종종 바꿀려면 쓰레드로 해야하나...
테스트용
************************************************************/
public class TestChange extends JPanel implements ActionListener{
JButton btn;
JLabel l1;
public TestChange(){
setLayout(new FlowLayout());
btn=new JButton(고고!!);
l1=new JLabel(대기중.....);
add(btn);
add(l1);
btn.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
for(int i=0; i10; i++){
l1.setText([+i+]);/////안바뀜
//JOptionPane.showMessageDialog(null, 확인!!);
for(int j=0; j100000000; j++){;}//딜레이
}
}
public static void main(String args[]){
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame.setDefaultLookAndFeelDecorated(true);
JDialog.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame(▒▒);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JComponent newContentPane = new TestChange();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
frame.pack();
frame.setLocation(100, 100);
frame.setVisible(true);
}
});
}
}
-
비사벌
스윙은 기본적으로 단일 쓰레드 환경만을 지원합니다. 따라서 쓰레드의 안전성을 위해 SwingUtilities 클래스에 invokeXXX 관련 메소드 들이 있는데요, 위와 같은 경우는 단순히 쓰레드를 사용하게 되면 해결되는 문제입니다.
-
유라
무조건 그래픽 출력이 우선순위에서 연산보다 밀리는거 같아요..
내부적으로 어떻게 돌아가는지 알 수가 없으니 문제의 근본적인 해결을 못하겠네요..
역시 그래도 결과는 좋으니.. ㅎㅎ -
머즌일
역시 쓰레드 밖에 없는가 보군요. 근데 저렇게 하니깐 간단하군요. 감사^^
혹시나 MFC에서 메시지피킹(?) 같은 건 없나 싶었는데...
갯수제한해서 쓰면 되겠네여. 감솨~ -
마루한
remove(1); l1.updateUI(); add(l1); 님하 해보니깐 이것도 안돼요~ ㅋ while 문써도 안돼고~ 과연 누가 이문제를 ㅡ.ㅡ;
-
든해솔
저분도 쓰레드는 알고 계신것 같은데.....
-
샤인
Thread t = new Thread(){
public void run(){
for(int i=0; i10; i++){
l1.setText(\[\+i+\]\);
try {Thread.sleep(1000);}
catch (InterruptedException e1) {e1.printStackTrace();}
}
}
};
t.start();
Thread로 돌려주시구요, 딜레이는 Thr -
어둠
쓰레드를 쓰세요;