시소당
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class TestPanel extends JPanel implements ActionListener{
JFrame owner;
JButton jb1 = new JButton("A");
JButton jb2 = new JButton("B");
public TestPanel(JFrame owner){
this.owner = owner;
add(jb1);
jb1.addActionListener(this);
jb2.addActionListener(this);
}
public void actionPerformed(ActionEvent ae){
if(ae.getActionCommand().equals("A")){
remove(jb1);
add(jb2);
}
else{
remove(jb2);
add(jb1);
}
//owner.pack();
}
protected void paintComponent(Graphics g){
super.paintComponent(g);
repaint();
revalidate();
}
}
public class Test extends JFrame{
public static void main(String args[]){
JFrame tf = new Test();
tf.add(new TestPanel(tf));
tf.setSize(100,100);
tf.setVisible(true);
tf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
프레임이 생성된 이후에 컴포넌트가 추가되거나 삭제되는것이 바로 표시 안되는것을
추가 된 직후 owner.pack(); 를 사용해도 해결이 되고
paintComponent()를 오버라이딩해서 repaint(); revalidate(); 을 사용해도 해결이 됐는데
둘이 차이가 무엇이면 무슨 장단점이 있는지 궁굼하네요.. 효율쪽에서나... 코드디자인면 에서나..
pack()이 나을꺼같기도 하고... paintComponent가 나을꺼같기도 하고..
여러분들 생각은 어떠세요?
--------------------------------------------------------------
pack() 을 할 때 자동으로 repaint 를 내부에서 불러주기 때문입니다
출처 : http://cafe.naver.com/javacircle.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=18438
[2008년 03월 07일 10:14:56 수정되었습니다.]