JButton的关注时间太长了

时间:2014-10-15 01:50:08

标签: java swing jbutton

我遇到一个JButton名为saveChanges的问题,在按下时会长时间专注,并且我不确定为什么会发生这种情况。以下是我的代码的摘录:

saveChanges.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        saveChanges.setFocusPainted(false);
        setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));

        // execute some code which inserts records into a database

        setCursor(Cursor.getDefaultCursor());
    }
}

此方法中的代码执行大约需要5-10秒,但由于某种原因,在saveChanges按钮返回非聚焦状态前几秒,光标将返回默认光标状态,我可以&#39 ;弄清楚原因。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:3)

Swing是一个单线程环境,任何阻止事件调度线程的东西,由Swing用来处理新事件,包括重绘请求,都会导致UI看起来像被冻结,因为它是。

有关详细信息,请查看Concurrency in Swing

同样,Swing不是线程安全的,这意味着必须在EDT的上下文中对UI进行任何更新。

您可以使用SwingWorker在后​​台执行长时间运行的过程(来自其doInBackground方法)并通过覆盖它来更新UI的状态done方法,一旦doInBackground方法退出,就会在EDT的上下文中调用。

请查看Worker Threads and SwingWorker了解详情

答案 1 :(得分:0)

非GUI进程应在与事件调度线程(EDT)不同的线程上执行。使用SwingWorker来处理这些操作。