2

我有一个带有边框布局的摆动 GUI。在NORTH我添加了一些组件。我的带有 GIF 图标的标签组件lblBusy.setVisible(false); 稍后是不可见的,一个按钮使其可见,如下所示。为什么它不显示?

btnDownload.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    lblBusy.setVisible(true);
                    btnCancel.setEnabled(true);
                }
            });

            download = new Download(txtSource.getText(), new File(txtDestination.getText()), textAreaStatus);
            download.start();
            lblBusy.setVisible(false);
        }
    });
4

3 回答 3

3

1) 这是EventDispatchThread相关的问题,EDT 非常保证对 GUI 的所有更改都会在某一刻完成

ActionPerformed2)您从调用JButton,直到所有事件结束,您的 GUI 应该被冻结或不负责任,对于您的情况也是JButton如此JLabel

3) 更好的方法是将读取内容重定向到背景任务,File例如SwingWorkerRunnable#Thread然后将被更改,GUI 将在后台任务期间负责鼠标或键盘JButtonJLabel

或者

4)肮脏的黑客分裂到两个分开的Action延迟javax.swing.Timer,但在这种情况下,直到所有事件结束,您的 GUI 将被冻结或不负责任

于 2012-01-25T16:31:21.717 回答
2

很可能是因为 GUI 是在标签不可见时打包的,所以没有分配空间来显示它。如需更明确的信息,请发布 SSCCE。

于 2012-01-25T16:24:32.940 回答
2

在我看来,您正在编写lblBusy.setVisible(true);,然后lblBusy.setVisible(false);在 mouseClicked() 方法中编写。由于您想在单击按钮时使其可见,因此您不是仅使用lblBusy.setVisible(true);,而不是同时使用两者。

lblBusy.setVisible(false);不过,一旦完成了它所做的事情,您就可以从下载类的末尾调用。

问候

于 2012-01-25T17:01:19.257 回答