Java Swing实用程序

时间:2014-06-24 06:23:52

标签: java swing

我想创建一条加载消息,在加载信息时会在屏幕上弹出。我将为它调用initLoadingPanel()方法,以便JFrame可见。我的问题是如何关闭它?

我的代码如下。

public class DataMigration extends JFrame{

    private JFrame frmDataMigration;

    private JFrame loader;

private JButton btnProcess;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    DataMigration window = new DataMigration();
                    window.frmDataMigration.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public DataMigration() {
        initialize();
    }

    private void initialize() {

        LoggerImp.startLog(CLASS_NAME, "initialize()");

        frmDataMigration = new JFrame();

btnProcess = new JButton("Load");
        btnProcess.setEnabled(false);
        btnProcess.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {

            SwingWorker <CSV, CSV> worker = new SwingWorker<CSV, CSV>() {

                @Override
                protected CSV doInBackground() throws Exception {
                    return FileReaderCSVHelper.fileReader(dirName.getText(), fileName.getText());
                }

                @Override
                protected void done() {
                    try {
                        csv = doInBackground();
                        generateTableList(csv.getCsvTitle(), stateController.getFieldNames());
                    } catch (ExecutionException ex) {
                        ex.printStackTrace();
                    } catch (Exception e){

                    }
                    loader.dispose();
                }

            };
            worker.execute();
        }
        });
     frmDataMigration.getContentPane().add(btnProcess);
}

   public void initLoadingPanel(){
     SwingUtilities.invokeLater(new Runnable() {
         @Override
         public void run() {
             loader = new JFrame("Loading....");
             ImageIcon img = new ImageIcon("loader.gif");
             loader.add(new JLabel(" Loading...", img, JLabel.CENTER));

             loader.setAlwaysOnTop(true);
             loader.pack();
             loader.setSize( 448, 497);
             loader.setVisible(true);
             loader.setLocationRelativeTo(null);
         }
     });
}

1 个答案:

答案 0 :(得分:5)

通常情况下,您只需拨打loader.dispose()loader.setVisible(false)即可,这就提出了如何加载资源的问题?

您可能需要将loader的引用传递给代码的这一部分,所以当它完成后,您可以处置该帧。

因为框架是装饰的,所以用户可以简单地点击&#34; [x]&#34;按钮并关闭窗口,虽然您可以将defaultCloseOperation设置为DO_NOTHING_ON_CLOSE,但它仍然看起来很奇怪。

您可以使用JFrame#setUndecorated

删除相框装饰

由于loaderJFrame延伸,用户仍然可以与父窗口进行交互(如果有可见),更好的解决方案可能是使用{{1}相反,让它成为模态。

您也可以考虑查看How to Create a Splash Screen了解其他一些想法

<强>更新

你正在掩盖你的变量......

首先,您将JDialog声明为loader

的实例字段
DataMigration

然后在public class DataMigration extends JFrame{ //... private JFrame loader; 的{​​{1}}方法中重新声明....

run

这意味着实例字段仍然为空,请尝试...

Runnable

,而不是...

也...

SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
        JFrame loader = new JFrame("Loading....");

不会做你认为应该做的事情......你&#34;可能&#34;幸运的是,SwingUtilities.invokeLater(new Runnable() { @Override public void run() { loader = new JFrame("Loading...."); 框架会出现,但它很可能因为你阻止事件调度线程而赢了。

相反,您应该考虑使用public void actionPerformed(ActionEvent arg0) { initLoadingPanel(); csv = FileReaderCSVHelper.fileReader(dirName.getText(), fileName.getText()); generateTableList(csv.getCsvTitle(), stateController.getFieldNames()); loader.dispose(); } ....

loader

(我不知道SwingWorker是什么类型,所以我猜...

这将确保您的用户界面在加载数据时保持响应...

查看Concurrency in Swing

使用工作示例进行更新....

Example

initLoadingPanel();
SwingWorker worker = new SwingWorker<CVS, CVS>() {

    @Override
    protected CVS doInBackground() throws Exception {
        return FileReaderCSVHelper.fileReader(dirName.getText(), fileName.getText());
    }

    @Override
    protected void done() {
        try {
            cvs = get();
            generateTableList(csv.getCsvTitle(), stateController.getFieldNames());
        } catch (ExecutionException ex) {
            ex.printStackTrace();
        }
        loader.dispose();
    }

};
worker.execute();