在UI线程开展业务时,如何向用户提供反馈,而不是按下按钮

时间:2012-01-08 05:59:18

标签: java swing jbutton

我有一个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);
}

1 个答案:

答案 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内点击JProgressBarSwingWorker不确定的SwingWorker

显然,Thread创建了一个新的Thread,但Java中的OTOH,{{1}}对象很便宜。其中有很多都是针对任何应用运行的。用GUI。还有几个人不会受伤。