Java Container.removeall()冻结应用程序
因此,从内容窗格中删除内容时遇到问题 此方法的代码为:Java Container.removeall()冻结应用程序,java,swing,Java,Swing,因此,从内容窗格中删除内容时遇到问题 此方法的代码为: Container pane = frame.getContentPane(); try{ pane.removeAll(); } catch(Exception ex){} pane.revalidate(); pane.repaint(); 我甚至不想在这里添加任何内容,但这不会删除任何内容。该框架包含一个带有JTextField和JButton的JPanel。JBu
Container pane = frame.getContentPane();
try{
pane.removeAll();
}
catch(Exception ex){}
pane.revalidate();
pane.repaint();
我甚至不想在这里添加任何内容,但这不会删除任何内容。该框架包含一个带有JTextField和JButton的JPanel。JButton有一个监听器,它在调用这个方法之前执行一系列操作
这个问题尤其令人沮丧,因为我以前在另一个应用程序中使用过这个精确的方法,它工作得很好
编辑-
好的,我做了一个简化的例子,但它的工作原理和它应该做的完全一样。我的应用程序与示例之间的唯一区别是,该应用程序是一个客户端,它接收来自服务器程序的指令,该程序应该触发组件的删除
下面是示例程序
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();
}
}
我的应用程序与示例之间的唯一区别在于,该应用程序是一个从服务器程序接收指令的客户端
这是一个很大的区别。这就是为什么每次发布问题时我们都需要正确的演示代码。我们需要所有的信息,因为在问题解决之前,你不知道什么信息是相关的或不相关的。当然,我们无法访问您的服务器,因此将来您需要创建一个“模拟”您试图执行的操作的演示,以演示问题
您的代码可能在等待服务器应答时阻塞,因此GUI无法重新绘制自身
无论何时与服务器连接,都需要使用单独的线程
有关更多信息,请阅读上的Swing教程部分。您可能应该使用
SwingWorder
来连接服务器。试图从内容窗格中删除所有内容,我认为您应该使用一个insteadPost来演示问题我以前在另一个应用程序中使用过这种精确的方法,效果很好。
为什么要使用这样的代码?每当我看到removeAll()方法时,我都会建议您可能应该使用。你为什么要抓住一个例外?我不知道removeAll()方法会引发异常。如果它确实抛出异常,那么您应该显示异常消息。不要使用空的catch块。如上所述,1)CardLayout会更好地工作,2)您有限的发布代码和信息不允许我们理解或解释您的程序的错误行为。问题在于代码没有显示,因此您应该为我们创建并发布您的代码,以便我们了解您的问题。同样,请阅读以了解如何创建它。请注意,冻结的Swing应用程序通常意味着您拥有在Swing事件线程上调用的长时间运行的代码,并且您发布的代码中没有一个显示这一点,。。。因此,我们对您的建议适用。感谢您发布上述最新代码,但您的GUI不会冻结,因此您的示例程序不会显示您所询问的错误行为,使其成为无效示例。所以,您的问题是您还没有找出程序错误行为的原因,这意味着您需要进行更多的调试才能找到它。