2013-02-14 41 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); 
    } 
}