我有一个JButton,它启动了一个JFileChooser。然而,JFileChooser通常需要几秒钟才会出现,在此期间用户可能会认为没有发生任何事情。我试图让按钮变为禁用,直到JFileChooser完成,但是在加载JFileChooser之前甚至不会禁用按钮。有什么我可以做的吗? 我的代码:
public void actionPerformed(ActionEvent e) {
System.err.println("clicked");
((JButton) e.getSource()).setEnabled(false);
System.err.println("set");
JFileChooser b = new JFileChooser("C:\\");
b.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int res = b.showOpenDialog((Component) e.getSource());
if (res == JFileChooser.APPROVE_OPTION) {
try {
//Blah
}
catch (Exception err) {
JDialog j = new JDialog(window, "An error occured:\n" + err.getMessage());
}
}
((JButton) e.getSource()).setEnabled(true);
}
答案 0 :(得分:3)
移动这些线..
JFileChooser b = new JFileChooser("C:\\");
b.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
..从动作执行的方法到动作侦听器的构造函数,将它们更改为..
b = new JFileChooser("C:\\");
b.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
..然后宣布..
private JFileChooser b;
..作为一个类属性(因此它对动作执行的方法可见)。
您可能还想给它一个更好的名字。
选择器将在创建类时构建,并在需要时准备好使用。这具有额外的好处,选择器将记住位置,大小,路径和位置。文件显示类型,用户随后激活按钮。
另一种策略是将选择器声明为类属性,不在构造函数中实例化它,但检查执行的操作是否为null
,如果是, ,创建和配置它。
<强>续.. 强>
我可能想在某些时候做一些像这样慢一点的事情,这不太值得它自己的线程。
根据我概述的最后一个策略,我正在考虑添加一些我现在要添加的内容。
<强> ..续强>
..当然,最后一种方法会给出你所描述的完全相同的问题,但只有当用户第一次点击按钮时才会出现一次。对于这种情况,您可能应该在JOptionPane
内点击JProgressBar
与SwingWorker
不确定的SwingWorker
。
显然,Thread
创建了一个新的Thread
,但Java中的OTOH,{{1}}对象很便宜。其中有很多都是针对任何应用运行的。用GUI。还有几个人不会受伤。