2012-11-26 14 views
8

Ho due pulsanti aggiunti in due pannelli diversi, se si fa clic sul primo pulsante, è necessario passare al pannello successivo con il secondo pulsante. Ma il pulsante non è stato sostituito quando faccio clic sul primo pulsante.GUI Java, Cambia pannello secondo 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); 
    } 



} 

risposta

4

Dopo aver rimosso tutti da contentPane, provare ad aggiungere il pannello a ContentPane. La seconda cosa è ridipingere. Se non si aggiornerà il contenuto del pannello, verrà dipinto dopo il ridimensionamento. Ecco a voi esempio soluzione:



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

    } 

Oracle docs spiega differenza beetwen aggiungendo contentPane o al fotogramma direttamente.
http://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html

4

È necessario eseguire la convalida e quindi ridipingere.

validate(); 
repaint(); 
+0

+1 Stavo solo scrivendo quando ho visto la tua risposta. @ Dan ha ragione, ti dimentichi semplicemente di convalidare (o invalidare?) Prima del ridisegno. A proposito: è utile "ridipingere" dopo la validazione? – HpTerm