2016-07-23 7 views
-1

Ich versuchteWarum entfernt die removeall() Methode nicht alle Komponenten von JFrame?

frame.removell(); 
frame.revalidate(); 
frame.repaint(); 

es nicht funktioniert hat. Dann habe ich versucht

frame.getContentPane().removeAll(); 
frame.revalidate(); 
frame.repaint(); 

Aber das funktioniert auch nicht. Ich versuche einfach, alle Komponenten aus dem bestehenden Frame zu entfernen und den gleichen Frame mit den gleichen Komponenten mit unterschiedlichen Werten neu zu laden, aber mit den obigen Codes zeigt die Anwendung einfach doppelte Panels in meinem bestehenden Frame.

+0

Apologies. Ich habe es auch mit den obigen Befehlen versucht, aber es hat nicht funktioniert. Ich habe meine Frage aktualisiert. – Naseem

+0

Fügen Sie die Komponenten direkt zum Frame hinzu oder fügen Sie sie einem Panel hinzu, das dem Frame hinzugefügt wird? Ich vermute, dass Sie doppelte Komponenten zu einem Panel hinzufügen, nicht zu dem Frame selbst. – Titus

+0

Ich füge Komponenten zum Panel hinzu und füge dann diese Panels in den JFrame ein. – Naseem

Antwort

1

Sie müssen nach dem Entfernen validieren(). Hier ist ein funktionierendes Demo von Entfernen Sie alle und das Hinzufügen einer neuen Komponente:

import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.event.MouseEvent; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.event.MouseInputAdapter; 

public class Test extends JFrame { 

    private int click_count = 0; 

    public Test(){ 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new GridLayout()); 
     addLabel(); 
     validate(); 
     pack(); 
    } 

    /** 
    * 
    */ 
    private void labelClicked() { 

     getContentPane().removeAll(); 
     addLabel(); 
     revalidate(); 
     repaint(); 
     click_count++; 
    } 

    /** 
    * 
    */ 
    private void addLabel() { 

     JLabel label = new JLabel("click count " + click_count); 
     label.setPreferredSize(new Dimension(200,100)); 
     label.addMouseListener(new MouseInputAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 

       labelClicked(); 
      } 
     }); 

     add(label); 
    } 

    public static void main(String[]arghs){ 

     Test frame = new Test(); 
     frame.setVisible(true); 
    } 
} 

Alternativ könnten Sie die Eigenschaften einer Komponente ändern, indem Sie es aktualisieren, ohne es zu entfernen und das Hinzufügen einer neuen:

import java.awt.Dimension; 
import java.awt.event.MouseEvent; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.event.MouseInputAdapter; 

public class Test extends JFrame { 

    private JLabel label; 
    private int click_count = 0; 

    public Test(){ 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     label = new JLabel("click count " + click_count); 
     label.setPreferredSize(new Dimension(200,100)); 
     label.addMouseListener(new MouseInputAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 

       labelClicked(); 
      } 
     }); 

     add(label); 
     validate(); 
     pack(); 
    } 

    /** 
    * 
    */ 
    private void labelClicked() { 
     click_count++; 
     updateLabel(); 
     repaint(); 

    } 

    /** 
    * 
    */ 
    private void updateLabel() { 

     label.setText("click count " + click_count); 
    } 

    public static void main(String[]arghs){ 

     Test frame = new Test(); 
     frame.setVisible(true); 
    } 
} 
+1

Sie müssen (re) validate() und repaint() nach dem Entfernen, weil LayoutManager keine Notifier über implementiert hat Übertragen Sie die Änderungen zur Laufzeit neu – mKorbel

+0

Sie müssen nicht validieren, wenn Sie erneut validieren, was das OP tut. Wie löst diese Antwort das Problem? – user1803551

+0

@ user1803551 implementiert, was der Benutzer wollte: Entfernen Sie alle und neue Komponenten. Darüber hinaus demonstriert es eine andere Option. – c0der

Verwandte Themen