点击后如何更新JButton的外观?

时间:2014-01-08 16:40:14

标签: java swing validation

我正在开发一个需要验证网址的Java7 Swing“向导”类型的项目,然后再继续执行向导的下一步。验证需要通过Internet访问URL以验证预期资源是否可用。在某些情况下,这可能需要几秒钟,这可能足以让用户感到困惑。

作为对此的快速解决方案,我想在验证运行时禁用“下一步”按钮并更改显示文本,以便用户知道向导正在运行而不会挂起任何内容。问题是,当我添加修改JButton的代码时,直到验证完成后才会发生任何更改。即使我在执行验证方法之前更改按钮并调用revalidate() ,也是如此。

以下是我尝试过的摘录:

// create next button
next = new JButton("Next", new ImageIcon(getClass().getResource("/navigate_right.png")));

next.setActionCommand("MYACTION");
next.addActionListener(new ActionListener()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        System.out.println("Is this the event dispatch thread? "
                + javax.swing.SwingUtilities.isEventDispatchThread());
        System.out.println("Changing button");

        next.setEnabled(false);
        next.setText("Testing Connection");
        next.getRootPane().revalidate();

        System.out.println("Validating Service");
        boolean isValidLocation = ServiceValidator.serviceExists(locationField.getText());

        // ...etc...

当我运行此代码时,“更改按钮”和“验证服务”这两行都会在实际按钮在显示屏上发生变化之前打印出来。如何在打印System.out.println("Validating Service");之前更改JButton?

1 个答案:

答案 0 :(得分:4)

  

问题在于,当我添加修改JButton的代码时,在验证完成之前不会发生任何更改。

您的代码正在EDT上执行,因此您长时间运行代码会阻止GUI重新绘制,直到任务完成执行。您需要为长时间运行的任务使用单独的线程,可能是SwingWorker。有关详细信息,请阅读Concurrency上的Swing教程中的部分。