为什么setVisible不起作用?

时间:2012-01-25 16:18:14

标签: java swing gif layout-manager border-layout

我有一个带边框布局的swing 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);
        }
    });

3 个答案:

答案 0 :(得分:3)

1)这是EventDispatchThread相关问题,EDT相当保证GUI的所有更改都会在一瞬间完成

2)您从ActionPerformed调用了JButton,并且直到您的GUI结束的所有事件都应该冻结或不负责任,对于您的案例中的JButtonJLabel相同< / p>

3)最好将File内容的重定向重定向到Backgroung任务,例如SwingWorkerRunnable#Thread然后JButtonJLabel将被更改,GUI将在负责鼠标或KeyBoard的后台任务中出现

4)脏兮兮的黑客被分成两个被Action分隔的javax.swing.Timer延迟{{1}},但在这种情况下,直到所有事件结束,你的GUI将被冻结或不负责任

答案 1 :(得分:2)

很可能是因为GUI在标签不可见时被打包,因此没有分配空间来显示它。更明确的是,发布SSCCE。

答案 2 :(得分:2)

在我看来,您在mouseClicked()方法中编写lblBusy.setVisible(true);之后写lblBusy.setVisible(false);。既然您只想点击按钮就可以看到它,那么您不是仅使用lblBusy.setVisible(true);,而是使用两者。

您可以在下载类的末尾调用lblBusy.setVisible(false);,一旦完成它的操作,就可以调用它。

此致