2013-07-28 3 views
0

JButton을 눌러 JPanels를 변경하고 싶습니다. 글쎄, 한 번만 할 수 있지만 문제는 이전 JPanel로 돌아가고 싶을 때입니다. 여기 내 코드입니다 : 내가 버튼 "retroceder"를 눌러 원하는JButton을 누른 후 JPanel을 변경하십시오.

public class MindCreations { 

public static void main(String[] args){ 

    Adj0 object1= new Adj0(); 
    object1.setSize(500, 600); 
    object1.setVisible(true); 
    object1.setLocation(700,300); 
} } 

    public class Adj0 extends JFrame{ 
      public Adj0(){ 
    super("MindCreations"); 
    this.setLayout(null); 

    adj0panel object9=new adj0panel(); 
    add(object9.adj0panel()); 
    Isa object10=new Isa(); 
    add(object10.Isa()); 
    } } 

    public class adj0panel { 
      private JButton quarto; 
      private FlowLayout layout; 

     public JPanel adj0panel(){ 

     final JPanel panel=new JPanel(); 
     JLabel jl=new JLabel(); 
     panel.setLayout(layout); 
      quarto= new JButton("Tabela ISA"); 
      quarto.setBounds(50,490,400,20); 
      jl.setIcon(new ImageIcon("2.png")); 
     jl.setBounds(40, 50, 413, 300); 

      panel.add(jl); 
      panel.add(quarto); 

      quarto.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent event){ 
     Isa object3=new Isa(); 
     panel.setVisible(false); 
    } 
     }); 
return panel; 
    } 
} 

    public class Isa { 
    public JPanel Isa(){ 

      final JPanel panel1=new JPanel(); 

    panel1.setLayout(layout); 
    panel1.setBounds(0, 0, 500, 600); 
    panel1.setBackground(Color.WHITE); 
    panel1.setVisible(true); 

      JButton retroceder=new JButton("Retroceder"); 
    retroceder.setBounds(300, 460, 90, 20); 

    retroceder.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent event){ 
      adj0panel object4=new adj0panel(); 
      panel1.setVisible(false); 

      }} 
    ); 

      panel1.add(retroceder); 
    return panel1; 
}} 

, 그리고 난 adj0panel 클래스 인 JPanel에 가고 싶다. 긴 질문에 미안해, 나는 이것에 초보자이다. 다른 방법으로 JPanels를 변경하는 경우 알려주십시오. 감사합니다.

답변

0

JFrame은 컨테이너에 하나의 JPanel 만 포함 할 수 있습니다.

이 :

frame.getContentPane(); 

는 "최상위"JPanel의 간주됩니다. 패널을 최상위 수준으로 추가하거나 제거 할 수 있습니다. 여러 패널을 추적하려면 스택에 push() 메서드를 사용하여 단추에 유선을 연결합니다.이 메서드는 먼저 모든 패널을 마스터 JPanel에 푸시 한 다음 스택에서 튀어 나와 해당 JPanel을 제거합니다. 마스터 컨테이너의 속담.

setVisible()이 작동 할 수 있지만 여러 패널이있는 경우 최상위 패널이 패널 자체를 "숨길"수 있으므로 setVisible()에서 예상치 못한 결과가 발생할 수 있습니다. 스윙은 힘들다. 다음은이를 백업 문서입니다 : Top-Level Containers

+0

흠, 내 프로그램에서 "frame.getContentPane()"을 추가 할 수있는 곳은 JButton "retroceder"의 actionlistener에 추가해야하며, 그렇다면 어떻게 작성해야합니까? – user2627865

+0

프레임을 param으로 사용하는 로더 메서드를 작성하고 다른 메서드는 프레임의 패널을 가져 와서 스택 개체에서 패널을로드합니다. 이 물건이 기본 메소드 나 PanelLoader 팩토리 스타일 클래스에있을 수 있다고 가정합니다. –

0

내가 로더를 만들려고 당신이 얘기하는이 있다면 나도 몰라,하지만 어쩌면 그것은 어쨌든 작동합니다.

public class Adj0 extends JFrame{ 

    private FlowLayout layout; 

     public Adj0(){ 
    super("MindCreations"); 
    this.setLayout(layout); 
    this.setSize(500, 600); 
    this.setLocation(700,300); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.setVisible(true); 
    dsa(1); 

    } 

public void dsa(int test){ 
    Isa object10 =new Isa();  
    adj0panel object0 =new adj0panel(); 

    if(test==1){ 
    this.getContentPane().removeAll(); 
    this.setContentPane(object0.adj0panel()); 
    this.getContentPane().revalidate(); 
    repaint(); 
    this.setLayout(null); 

} 
    else if(test==2){ 
     this.getContentPane().removeAll(); 
     this.setContentPane(object10.Isa()); 
     this.getContentPane().revalidate(); 
     this.setVisible(true); 
     repaint(); 
     this.setLayout(null); 

    } 
    } 

은 후 버튼에서 내가 쓴 :

 quarto.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent event){ 

     Adj0 object3=new Adj0(); 
     object3.dsa(2); 
나는 이것이 내가 원하는 패널과 새로운 JFrame의를 생성 버튼을 누를 때 일이, 내가 단지를 변경하려면된다

함유량. 나는 이전 contentpane을 올바른 방법으로 제거하지 않는다고 생각합니다. 어쩌면 당신은 나에게 몇 가지 팁을 말할 수 있습니다.

관련 문제