0

我正在尝试为我的程序创建一个加载屏幕,以便在加载主屏幕或执行特定任务时显示加载屏幕。我尝试使用 JDialog 作为加载屏幕,但由于某种原因,一旦加载屏幕对话框打开,它就不会让主程序运行它自己的工作。如何让它们同时工作?

这是我的加载屏幕的代码:

public class FrmLoading extends JDialog {

  private static FrmLoading loading;

  public FrmLoading(java.awt.Frame parent, boolean modal) {
    super(parent, modal);
    initComponents();
    this.setLocationRelativeTo(null);
  }

  public static void startAnimation(){
    loading = new frmLoading(null, true);
    loading.setVisible(true);
  }

  public static void stopAnimation(){
    loading.dispose();
  }

  private void initComponents(){
    //build the Dialog
  }
}

这就是我使用它的方式:

private void login(){
    FrmLoading.startAnimation();
    //open main program
}

...

private void mainStart(){
    //load contents
    FrmLoading.stopAnimation();
}

我知道有一个默认为 java swing 的加载屏幕,但我不想使用它,我想要我制作的动画。

4

3 回答 3

3

使用SwingWorker

SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
    @Override
    protected Void doInBackground() {
        //do your stuff in background
        return null;
    }

    @Override
    protected void done() {
        frmMain.setVisible(true);
        loading.dispose();
        disposeThis(); //a method that calls this.dispose();
    }
};
worker.execute();
loading.setVisible(true);
于 2012-11-27T16:18:12.103 回答
2

为什么要JFrame用于加载屏幕。考虑使用类似的东西JWindow

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JPanel;
import javax.swing.JWindow;

public class LoadingScreenDemo extends JWindow{
    Panel panel = new Panel();


    public LoadingScreenDemo() {
        addMouseListener(new MouseAdapter(){
            public void mouseClicked(MouseEvent e){
                if(e.getClickCount() == 2){
                    dispose();
                }
            }
        });
        panel.setBackground(Color.YELLOW);
        add(panel);
    }


    public static void main(String[] args) {
        LoadingScreenDemo m = new LoadingScreenDemo();
        m.setSize(640,480);
        m.setLocationRelativeTo(null);
        m.setVisible(true);
    }

    class Panel extends JPanel{

        public void paintComponent(Graphics g){
            super.paintComponent(g);
            g.setFont(new Font("Verdana",Font.BOLD,24));
            g.drawString("Loading...", 270, 210);

            g.setFont(new Font("Verdana",Font.PLAIN,14));
            g.drawString("OS: "+System.getProperty("os.name"), 10,400);
            g.drawString("OS version"+System.getProperty("os.version"), 10,420);
            g.drawString("Java vendor: "+System.getProperty("java.vendor"), 10,440);
            g.drawString("Java version: "+System.getProperty("java.version"), 10,460);
        }
    }

}

在此处输入图像描述

于 2012-11-27T17:02:00.627 回答
1

而不是在 JDialog 构造函数中使用布尔模态参数,您可能希望将JDialog 构造函数与modality一起使用,并传入 MODELESS 枚举。

这可能会阻止主窗口阻塞。

于 2012-11-27T16:21:19.197 回答