2013-02-14 8 views
5

voglio sostituire un JPanel con un altro in un JFrame ho già Ricerca e cerco il mio codice, ma nulla di ciò accada questo è il mio codice:Come sostituire JPanel con un altro 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); 
    } 
} 

Qualcuno mi può aiutare ? Grazie mille

risposta

2

È necessario chiamare validate() e quindi repaint() sul pannello di contenimento dopo aver rimosso e aggiunto operazioni.

contain.validate(); 
contain.repaint(); 
5
  1. fare non usare AbsoluteLayout

  2. cambiamento validate(); in actionPerformed per contain.validate(); e segue con contain.repaint();

  3. rename nome della classe (parola Java riservata, o il nome metodi) Frame (java.awt.Frame) a MyFrame (ad esempio)

  4. uso CardLayout invece di rimuovere e quindi aggiungere un nuovo JPanel sul runtime

+0

+1 per cardlayout e consigli, sebbene raccomandi 'revalidate()' su 'validate()'. @ArdyYonathan Vedi [qui] (http://stackoverflow.com/questions/14011397/how-to-add-jpanel-by-clicking-jbutton/14012757#14012757) per un esempio di CardLayout –

+2

@David Kroukamp non valido per tutti Gli utenti Java, la maggior parte di loro ancora usano Java6 e versioni minori (mancano la maggior parte delle restrizioni per il sistema operativo Windows) – mKorbel

+0

+1 true. Lol ma forse il nostro codice li costringerà a ottenere java 7 (o l'ultima versione) :) –

1

quello che devi fare in questo modo:

 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

diversi problemi con il codice. Ecco la versione fissa:

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