2016-07-23 113 views
-1

我试图为什么removeall()方法不会从JFrame中删除所有组件?

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

它并没有奏效。然后我试了

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

但是这也行不通。我只是试图从现有框架中删除所有组件,并使用具有不同值的相同组件重新加载相同框架,但使用上面的代码,应用程序只是在现有框架中显示重复面板。

+0

道歉。我也尝试了上述命令,但它没有奏效。我更新了我的问题。 – Naseem

+0

您是直接将组件添加到框架还是将它们添加到添加到框架的面板?我的猜测是,您将重复组件添加到面板而不是框架本身。 – Titus

+0

我正在向面板添加组件,然后在JFrame中添加这些面板。 – Naseem

回答

1

您需要验证()后删除。下面是删除所有和添加新的组件的工作演示:

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

另外,您可以通过更新其更改组件的属性,而不删除它,并加入一个新问题:

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

您需要(重新)验证()和repaint()删除后,因为LayoutManager尚未实现任何通知在运行时重新布局更改 – mKorbel

+0

您不需要验证是否重新验证,这是OP正在执行的操作。这个答案如何解决问题? – user1803551

+0

@ user1803551它实现了用户想要的内容:删除所有和新组件。另外它还演示了另一种选择。 – c0der

相关问题