2013-02-14 4 views
5

Chcę zastąpić JPanel z innym w JFrame Już wyszukiwania i spróbuj mojego kodu, ale nic się nie stanie to mój kod:Jak wymienić JPanel z innego 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); 
    } 
} 

może ktoś mi pomóc ? Wielkie dzięki

Odpowiedz

2

Po wykonaniu operacji usuwania i dodawania należy wywołać validate(), a następnie repaint() na panelu zawierającym.

contain.validate(); 
contain.repaint(); 
5
  1. zrobić, aby nie używać AbsoluteLayout

  2. zmianę validate(); w actionPerformed do contain.validate(); i podąża z contain.repaint();

  3. przemianowania nazwy klasy (zarezerwowanym słowem Java lub nazwa metody) Frame (java.awt.Frame) do MyFrame (na przykład)

  4. użycie CardLayout zamiast usunąć, a następnie dodać nowy JPanel na starcie

+0

+1 za cardlayout i porady, choć polecam 'revalidate()' over 'validate()'. @ArdyYonathan Zobacz [tutaj] (http://stackoverflow.com/questions/14011397/how-to-add-jpanel-by-clicking-jbutton/14012757#14012757) na przykład CardLayout –

+2

@ David Kroukamp nie dotyczy wszystkich Użytkownicy Java, większość z nich wciąż używa Java6 i wersji drugorzędnej (brakowało tam większości ograniczeń dla systemu operacyjnego Windows) – mKorbel

+0

+1 true .. Lol, ale może nasz kod zmusi ich do pobrania wersji Java 7 (lub najnowszej wersji) :) –

1

trzeba zrobić tak:

 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

kilka problemów z kodem. Tutaj jest naprawiona wersja:

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); 
    } 
}