我正在开发一个需要验证网址的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?
答案 0 :(得分:4)
问题在于,当我添加修改JButton的代码时,在验证完成之前不会发生任何更改。
您的代码正在EDT上执行,因此您长时间运行代码会阻止GUI重新绘制,直到任务完成执行。您需要为长时间运行的任务使用单独的线程,可能是SwingWorker
。有关详细信息,请阅读Concurrency上的Swing教程中的部分。