2012-11-26 41 views
8

我在兩個不同的面板中添加了兩個按鈕,如果單擊第一個按鈕,則需要使用第二個按鈕進入下一個面板。但是當我點擊第一個按鈕時,按鈕沒有被替換。Java GUI,根據actionListener更改面板

/*Java GUI*/ 

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


public class TestFrame extends JFrame{ 

    private JPanel panel1, panel2; 
    private JButton but,but2; 

    public TestFrame() 
    { 
     createPanel(); 
     addPanel(); 
    } 

    private void createPanel() 
    { 
     panel1 = new JPanel(); 
     but = new JButton("TestButton"); 
     but.addActionListener(new addButtonListener()); 

     panel2 = new JPanel(); 
     but2 = new JButton("TestButton2"); 

    } 

    private void addPanel() 
    { 
     panel1.add(but); 
     panel2.add(but2); 

     add(panel1); 

    } 

    class addButtonListener implements ActionListener 
    { 
     public void actionPerformed(ActionEvent ae) 
     { 
      getContentPane().removeAll(); 
      add(panel2); 

      repaint(); 
     } 
    } 


    public static void main(String args[]) 
    { 
     JFrame frame = new TestFrame(); 
     frame.setTitle("Test Software"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(500,500); 

     frame.setVisible(true); 
    } 



} 

回答

4

重新從contentPane中取出所有內容後,嘗試將面板添加到ContentPane。第二件事是重新粉刷。如果您不更新面板內容,則會在調整大小後進行繪製。在這裏,你是示例解決方案:



    import java.awt.event.ActionEvent; 

    import java.awt.event.ActionListener; 

    import javax.swing.*; 

    public class Frame extends JFrame{ 
     private JPanel panel1, panel2; 
     private JButton but,but2; 
     public Frame() 
     { 
      createPanel(); 
      addPanel(); 
     } 
     private void createPanel() 
     { 
      panel1 = new JPanel(); 
      but = new JButton("TestButton"); 
      but.addActionListener(new addButtonListener()); 
      but.setBounds(50, 90, 190, 30);//There are example values but remember about setting size 
      panel2 = new JPanel(); 
      but2 = new JButton("TestButton2"); 
      but2.setBounds(50, 50, 90, 30);//There are example values but remember about setting size 
     } 
     private void addPanel() 
     { 
      panel1.add(but); 
      panel2.add(but2); 
      add(panel1); 
     } 

     class addButtonListener implements ActionListener 
     { 
      public void actionPerformed(ActionEvent ae) 
      { 
       getContentPane().removeAll(); 
       getContentPane().add(panel2);//Adding to content pane, not to Frame 
       repaint(); 
       printAll(getGraphics());//Extort print all content 
      } 
     } 

     public static void main(String args[]) 
     { 
      Frame frame = new Frame(); 
      frame.setTitle("Test Software"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setSize(500,500); 
      frame.setVisible(true); 
     } 

    } 

甲骨文的文檔說明beetwen增加的contentPane或直接幀差。
http://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html

4

您需要進行驗證然後重新繪製。

validate(); 
repaint(); 
+0

+1當我看到你的答案時,我只是在寫這個。 @Dan是對的,你只需在重繪之前忘記驗證(或無效?)。順便說一句:驗證後「重繪」有用嗎? – HpTerm