如何在java中同时运行两个帧

如何在java中同时运行两个帧,java,swing,loading,multitasking,jdialog,Java,Swing,Loading,Multitasking,Jdialog,我正在尝试为我的程序创建一个加载屏幕,以便在加载主屏幕或执行特定任务时显示加载屏幕。我尝试使用JDialog作为加载屏幕,但由于某种原因,一旦加载屏幕对话框打开,它就不允许主程序运行自己的作业。如何使它们同时工作 以下是我的加载屏幕的代码: public class FrmLoading extends JDialog { private static FrmLoading loading; public FrmLoading(java.awt.Frame parent, boole

我正在尝试为我的程序创建一个加载屏幕,以便在加载主屏幕或执行特定任务时显示加载屏幕。我尝试使用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有一个默认的加载屏幕,但我不想使用它,我想要我制作的动画。

使用

SwingWorker-worker=新的SwingWorker(){
@凌驾
受保护的Void doInBackground(){
//在后台做你的事情
返回null;
}
@凌驾
受保护的void done(){
frmMain.setVisible(真);
loading.dispose();
disposeThis();//调用this.dispose()的方法;
}
};
worker.execute();
loading.setVisible(true);
使用

SwingWorker-worker=新的SwingWorker(){
@凌驾
受保护的Void doInBackground(){
//在后台做你的事情
返回null;
}
@凌驾
受保护的void done(){
frmMain.setVisible(真);
loading.dispose();
disposeThis();//调用this.dispose()的方法;
}
};
worker.execute();
loading.setVisible(true);

您可能希望使用、并传入无模式枚举,而不是在JDialog构造函数中使用布尔模态参数


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

您可能需要使用、并传入无模式枚举,而不是在JDialog构造函数中使用布尔模式参数


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

为什么要使用
JFrame
加载屏幕。考虑使用类似<代码> jwindows < /> >:

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);
        }
    }

}

为什么要使用
JFrame
加载屏幕。考虑使用类似<代码> jwindows < /> >:

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);
        }
    }

}

我应该把这个放在哪里?在FrmLoading类还是主类上?在超类中使用它。执行辅助进程时,将对话框设置为可见。在doInBackground方法中,放置所有你想做的事情。完成后,在done()中,您只需将其设置为不可见,或者为加载对话框调用dispose()。问题是,当我的程序启动时,它将转到FrmLogin类。从那里,一旦用户按下登录按钮,它将开始运行FrmLoading。FrmLogin将打开FrmMain,其中FrmMain将加载其所有内容,完成后,将停止frmload。在您提供的代码片段中,我该如何做?谢谢你的帮助。把你的货币放在同一个工人身上。由于您仅将FrmLoading用于演示,因此可以在FrmLoading显示时从FrmLogin加载所有内容。加载完成后,打开您创建的主实例并处理登录实例和加载实例。我应该将其放置在哪里?在FrmLoading类还是主类上?在超类中使用它。执行辅助进程时,将对话框设置为可见。在doInBackground方法中,放置所有你想做的事情。完成后,在done()中,您只需将其设置为不可见,或者为加载对话框调用dispose()。问题是,当我的程序启动时,它将转到FrmLogin类。从那里,一旦用户按下登录按钮,它将开始运行FrmLoading。FrmLogin将打开FrmMain,其中FrmMain将加载其所有内容,完成后,将停止frmload。在您提供的代码片段中,我该如何做?谢谢你的帮助。把你的货币放在同一个工人身上。由于您仅将FrmLoading用于演示,因此可以在FrmLoading显示时从FrmLogin加载所有内容。加载完成后,打开您创建的主实例并处理登录实例和加载实例。我想让
modal=false
就可以了。尽管如此,默认设置还是可以做很多事情。我已经尝试过了,但是它没有显示我的加载屏幕。我想让
modal=false
就可以了。尽管如此,默认设置还是可以做很多事情。我已经尝试过了,但是它没有显示我的加载屏幕。你模拟@trashgood会做什么。谢谢你的建议!:)你是否在模拟“垃圾神”会做什么。谢谢你的建议!:)