Container.removeall()冻结应用程序

时间:2014-07-04 16:17:10

标签: java swing

所以我在从内容窗格中删除内容时遇到问题。

此方法的代码是:

    Container pane = frame.getContentPane();

    try{
        pane.removeAll();
    }
    catch(Exception ex){}

    pane.revalidate();
    pane.repaint();

我甚至没有在这里添加任何东西,但这并没有删除任何东西。该框架包含一个带有JTextField和JButton的JPanel。在调用此方法之前,JButton有一个监听器可以执行大量的操作。

这个问题特别令人沮丧,因为我之前在另一个应用程序中使用了这个确切的方法,它的工作正常。

编辑 - 好的,我做了一个简化的例子,但它的工作方式与它应该完全一样。我的应用程序和示例之间的唯一区别是app是一个客户端,它接收来自服务器程序的指令,该服务器程序应该触发删除组件。

以下是示例程序

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class RemoveButton{

    private static JFrame frame;

    public static void main(String[] args){

        frame = new JFrame("Remove Components Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(200,200);

        JPanel panel = new JPanel(new GridBagLayout());

        GridBagConstraints constraints = new GridBagConstraints();
        constraints.fill = GridBagConstraints.HORIZONTAL;


        JTextField field = new JTextField(25);

        constraints.gridx = 0;
        constraints.gridy = 0;

        panel.add(field,constraints);


        JButton button = new JButton("Remove");
        button.addActionListener(new ActionListener(){
                                public void actionPerformed(ActionEvent e){

                                    try{
                                        updatePane();
                                    }
                                    catch(Exception ex){
                                        ex.printStackTrace();
                                    }

                                }
                            });

        constraints.gridx = 0;
        constraints.gridy = 1;

        panel.add(button,constraints);

        frame.getContentPane().add(panel);

        frame.setVisible(true);

    }

    private static void updatePane(){

        Container pane = frame.getContentPane();

        pane.removeAll();

        pane.revalidate();
        pane.repaint();
    }

}

1 个答案:

答案 0 :(得分:1)

  

我的应用和示例之间的唯一区别是应用是从服务器程序接收指令的客户端

这是一个很大的不同。这就是为什么我们每次发布问题时都需要适当的演示代码。我们需要所有信息,因为在问题解决之前,您不知道什么是相关信息或不相关信息。当然,我们无法访问您的服务器,因此将来您需要创建一个模拟"模拟"你想要做什么来证明这个问题。

您的代码在等待服务器回复时可能会阻塞,因此GUI无法重新绘制。

每当与服务器连接时,您都需要使用单独的线程。

阅读Concurrency in Swing上Swing教程中的部分以获取更多信息。您应该使用SwingWorder来连接服务器。