2013-02-14 44 views
5

取代的JPanel我想與另一位在一個JFrame 我已經搜索並嘗試我的代碼,但沒有什麼是發生 更換一個JPanel這是我的代碼:如何與其他的JPanel

public class Frame extends JFrame { 

    private Container contain; 
    private JPanel reChange,reChange2; 
    private JButton reChangeButton; 

    public Frame() { 
     super("Change a panel"); 
     setSize(350, 350); 
     setLayout(null); 
     setLocationRelativeTo(null); 
     setResizable(false); 

     reChange = new JPanel(null); 
     reChange.setBackground(Color.red); 
     reChange.setSize(240, 225); 
     reChange.setBounds(50, 50, 240, 225); 
     add(reChange); 

     reChangeButton = new JButton("Change It"); 
     reChangeButton.setBounds(20, 20, 100, 20); 
     add(reChangeButton); 

     reChangeButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       //System.out.println("in"); 
       contain = getContentPane(); 
       contain.removeAll(); 
       //System.out.println("in2"); 

       reChange2 = new JPanel(null); 
       reChange2.setBackground(Color.white); 
       reChange2.setSize(240, 225); 
       reChange2.setBounds(50, 50, 240, 225); 
       //System.out.println("in3"); 

       contain.add(reChange2); 
       validate(); 
       //System.out.println("in4"); 
       setVisible(true); 
       //System.out.println("in5"); 
      } 
     }); 

    } 

    public static void main(String[] args) { 
     Frame frame = new Frame(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

有人可以幫助我?非常感謝

回答

2

在完成刪除和添加操作後,您必須在包含面板上調用validate()然後repaint()

contain.validate(); 
contain.repaint(); 
5
  1. 不要使用AbsoluteLayout

  2. 變化validate();actionPerformedcontain.validate();contain.repaint();

  3. 重命名類名(Java的保留字,或方法名稱)如下Framejava.awt.Frame)至MyFrame(例如)

  4. 使用CardLayout改爲移除,然後在運行時

+0

+1對於cardlayout和advices,雖然我會推薦'revalidate()'over validate()'。 @ArdyYonathan請參閱[這裏](http://stackoverflow.com/questions/14011397/how-to-add-jpanel-by-clicking-jbutton/14012757#14012757)CardLayout的示例 – 2013-02-14 13:22:40

+2

@David Kroukamp不適用於所有人Java用戶,他們中的大多數仍然使用Java6和次要版本(錯過了Windows操作系統的大部分限制) – mKorbel 2013-02-14 13:31:33

+0

+1 true ..大聲笑,但也許我們的代碼將迫使他們得到Java 7(或最新版本):) – 2013-02-14 13:32:31

1

你需要做這樣的添加新JPanel

 public void actionPerformed(ActionEvent e) { 
     //System.out.println("in"); 
     contain = getContentPane(); 
     contain.removeAll(); 
     //System.out.println("in2"); 

     reChange2 = new JPanel(null); 
     reChange2.setBackground(Color.white); 
     reChange2.setSize(240, 225); 
     reChange2.setBounds(50, 50, 240, 225); 
     //System.out.println("in3"); 

     contain.add(reChange2); 
     validate(); 
     repaint(); 
     //System.out.println("in4"); 
     setVisible(true); 
     //System.out.println("in5"); 
    } 
}); 
1

的幾個問題與您的代碼。這裏是固定的版本:

public class Frame extends JFrame { 

    private Container contain; 
    private JPanel reChange,reChange2; 
    private JButton reChangeButton; 

    public Frame() { 
     super("Change a panel"); 
     setSize(350, 350); 
     getContentPane().setLayout(null); // Changed here 
     setLocationRelativeTo(null); 
     setResizable(false); 

     reChange = new JPanel(null); 
     reChange.setBackground(Color.red); 
     reChange.setSize(240, 225); 
     reChange.setBounds(50, 50, 240, 225); 
     getContentPane().add(reChange); // Changed here 

     reChangeButton = new JButton("Change It"); 
     reChangeButton.setBounds(20, 20, 100, 20); 
     getContentPane().add(reChangeButton); // Changed here 

     reChangeButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       contain = getContentPane(); 
       contain.removeAll(); 

       reChange2 = new JPanel(null); 
       reChange2.setBackground(Color.white); 
       reChange2.setSize(240, 225); 
       reChange2.setBounds(50, 50, 240, 225); 

       contain.add(reChange2); 
       invalidate(); // Changed here 
       repaint(); // Changed here 
      } 
     }); 
    } 

    public static void main(String[] args) { 
     Frame frame = new Frame(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
}