2014-05-15 2 views
1

동적으로 패널을 변경하고이 answer처럼 표시하려면 cardLayout을 사용하는 것이 좋습니다. 하지만 전체 UI (왼쪽 단추가 남아 있지 않음)를 바꾸고 싶습니다. cardLayout이 그렇게 편리하지는 않습니다. MyDrawPanel1에 좀 더 코드 :Java : 유효성이 작동하지 않는 이유

public MyDrawPanel1(final JFrame frame) { 
    clickButton.addActionListener(new ActionListener(){ 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      // TODO Auto-generated method stub 
      frame.getContentPane().removeAll(); 
      //frame.validate(); 
      frame.getContentPane().add(new MyDrawPanel2()); 
      ((JPanel)frame.getContentPane()).revalidate(); 

     } 

    }); 
    this.add(clickButton); 

} 

편집 :

JFrame frame = new JFrame ("Key test"); 
    MyDrawPanel1 dp1 = new MyDrawPanel1(frame); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible (true); 
    JPanel p = new JPanel(); 
    p.setLayout(new BorderLayout()); 
    p.add(dp1,BorderLayout.CENTER); 

    frame.getContentPane().add(p); 
    frame.pack(); 
    frame.setVisible (true); 

그리고 MyDrawPanel1에서

패널을 변경할 수있는 버튼이 : 그래서 나는 다음과 같은 코드가 있습니다.

JButton clickButton = new JButton("click"); 

Image image = new ImageIcon("D:/0.jpg").getImage(); 
public void paintComponent (Graphics g) { 
    super.paintComponent(g); 
    g.drawImage(image, 3, 40, null); 
} 
public Dimension getPreferredSize() { 
    if (image != null) { 
     return new Dimension(image.getWidth(null), image.getHeight(null)); 
     } 
     return super.getPreferredSize(); // default 
} 

하지만 첫 번째 패널은 사라지지 않으며 두 번째 패널을 볼 수 있도록 패널을 최소화해야합니다. 내 질문은 유효성 검사가 작동하지 않는 이유와 다른 대안이있는 이유입니다. 감사.

편집 :.

enter image description here가 (후 클릭) : enter image description here

편집 : madProgrammer 및 ADARSH Singhal이 두 가지를 제공 여기에 내가 패널에 대해 냈다 사진 (첫번째 패널)이다 문제를 해결하는 방법. 첫 번째 패널은 super.paintComponent()라고 부르지 않는 두 번째 패널입니다. 따라서이 패널을 추가하면 잘 작동합니다 (이 패널은 지우개이므로이 answer라고 말함). 두 번째 프레임을 호출합니다. repaint(),하지만 왜 이해가 안돼?

+1

'revalidate()'을 시도해보십시오. CardLayout에는 어떤 문제가 있습니까? –

+1

API가 패널을 무효화 상태로 간주하지 않았을 수 있습니다. – MadProgrammer

+0

당신이 필요로하는 것은 validate()가 아니라 invalidate()입니다. –

답변

1

repaint()를 사용하여 구성 요소에 다시 칠하기를 지시해야합니다. 귀하의 사건으로 시각화하십시오. revalidate는 레이아웃을 업데이트하는 데 사용됩니다. 따라서 구성 요소를 동적으로 추가/제거 할 때마다 둘 다 호출해야합니다.

다음 작성된 코드가 완전히 JFrame의에 레드 DP1 (JPanel의)을 그릴 수 CardLayoutJFrame의 세트를 표시합니다. dp1에는 Jbutton이 있습니다. 해당 버튼을 클릭하면 dp1이 제거됩니다 & dp2 (JPanel)가 그려집니다. dp2는 변경 사항을 구분하기 위해 녹색입니다. 당신이 잊어 버린 것 같습니다 repaint().

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class MyFrame extends JFrame{ 
    JButton button; 
    private static MyFrame frame; 
    public MyFrame(){ 
     this.setSize(400, 400); 
     this.setLayout(new CardLayout()); 
     this.setLocationRelativeTo(null); 
     JPanel dp1 = new JPanel(); 
     dp1.setBackground(Color.RED); 
     add(dp1); 
     button = new JButton("Click me to remove dp1 & draw dp2"); 
     dp1.add (button); 
     JPanel dp2 = new JPanel(); 
     dp2.setBackground(Color.GREEN); 


     button.addActionListener(new ActionListener(){ 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       frame.getContentPane().remove(dp1); 
       frame.add(dp2); 
       frame.revalidate(); 
       frame.repaint(); 

      }}); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible (true); 
    } 

    public static void main(String[] args) { 
     frame = new MyFrame(); 
    } 
} 
+0

고마워요, 다시 페인트하면 잘 작동합니다. 또 하나의 질문은 왜입니까? – Tony

관련 문제