Java帧在while循环期间未正确显示

Java帧在while循环期间未正确显示,java,swing,netbeans,concurrency,jframe,Java,Swing,Netbeans,Concurrency,Jframe,这里有一个严重的问题,我有一个jFrame。我有一个“主框架”,所有的事情都是从那里开始的,但是我有另一个框架,其中有一个gif图像(加载,那个圆圈一圈又一圈),它被用作启动屏幕,上面写着“正在处理,请稍候”,然而当我穿过那个框架,我的while循环运行时,帧变为空白,直到循环结束后才显示任何内容 我假设这是由于while循环消耗计算机资源并“阻止”任何其他进程运行 请告诉我该怎么做 声明新框架的代码是标准的,但我将在下面发布它 Processing nc = new Processing();

这里有一个严重的问题,我有一个jFrame。我有一个“主框架”,所有的事情都是从那里开始的,但是我有另一个框架,其中有一个gif图像(加载,那个圆圈一圈又一圈),它被用作启动屏幕,上面写着“正在处理,请稍候”,然而当我穿过那个框架,我的while循环运行时,帧变为空白,直到循环结束后才显示任何内容

我假设这是由于while循环消耗计算机资源并“阻止”任何其他进程运行

请告诉我该怎么做

声明新框架的代码是标准的,但我将在下面发布它

Processing nc = new Processing();
nc.setVisible(true);
以下是我的完整代码,您可以看到我试图实现的目标:

来自第1帧的代码(Excel提取器):


您可以在java.util包中使用Timer类,并安排timertask在一段时间后(例如2分钟或任务完成后)关闭启动屏幕

 final Processing nc = new Processing();
 nc.setVisible(true);
 Timer timer = new Timer():
 TimerTask task = new TimerTask() {
      public void run() { 
          nc.setVisible( false );
          // to do disposing nc
      }
 };
 timer.schedule( task, 1000 * 3 ); // dispose the processing frame after 3 minutes

如果不知道你想做什么,你就不可能完全得到一个确切的答案

从您试图在事件调度线程的上下文中运行长时间运行的任务的声音中。这个线程负责处理重绘请求

阻塞此线程,可防止Swing自行重新绘制

据我所知,你想使用。这将允许您在后台线程中执行工作,同时将更新重新同步回EDT

用示例更新

我知道你说不“想”使用SwingWorker,但说实话,这样更简单更安全

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class LongRunningTask {

    public static void main(String[] args) {
        new LongRunningTask();
    }

    public LongRunningTask() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                new BackgroundWorker().start();

            }
        });
    }

    public class BackgroundWorker extends SwingWorker<Object, Object> {

        private JFrame frame;

        public BackgroundWorker() {
        }

        // Cause exeute is final :P
        public void start() {
            ImageIcon icon = new ImageIcon(getClass().getResource("/spinner.gif"));
            JLabel label = new JLabel("This might take some time");
            label.setIcon(icon);

            frame = new JFrame("Testing");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new GridBagLayout());
            frame.add(label);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);

            execute();
        }

        @Override
        protected Object doInBackground() throws Exception {

            System.out.println("Working hard...");
            Thread.sleep(1000 + (((int)Math.round(Math.random() * 5)) * 1000));
            System.out.println("Or hardly working...");

            return null;

        }

        @Override
        protected void done() {
            frame.dispose();
        }

    }
}

导入java.awt.BorderLayout;
导入java.awt.EventQueue;
导入java.awt.GridBagLayout;
导入javax.swing.ImageIcon;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.SwingWorker;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类LongRunningTask{
公共静态void main(字符串[]args){
新的LongRunningTask();
}
公共长运行任务(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
新建BackgroundWorker().start();
}
});
}
公共类BackgroundWorker扩展SwingWorker{
私有JFrame;
公共后台工作人员(){
}
//原因是最终的:P
公开作废开始(){
ImageIcon=newImageIcon(getClass().getResource(“/spinner.gif”);
JLabel label=新的JLabel(“这可能需要一些时间”);
label.setIcon(图标);
框架=新的JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的GridBagLayout());
框架。添加(标签);
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
执行();
}
@凌驾
受保护对象doInBackground()引发异常{
System.out.println(“努力工作…”);
sleep(1000+((int)Math.round(Math.random()*5))*1000);
System.out.println(“或几乎不工作…”);
返回null;
}
@凌驾
受保护的void done(){
frame.dispose();
}
}
}

while循环在哪个线程上运行?如果您的while循环在事件分派线程上运行,那么在while循环完成之前,事件处理将被阻止;没有代码更好,为了更好的帮助,请尽快发布@MadProgrammerNo提供的一个简短、可运行、可编译、更多的答案,您不应该这样做。使用java.util.Timer不会在事件调度线程的run方法内执行,这违反了Swing的线程规则。你可以用javax.swing.Timer来代替,虽然我从过去的经验中知道java.util.time永远不会正常工作,事实上,如果我说的正确,它会阻止EDT吗?如果使用时间,则使用javax.swing.timer。。。我可能完全错了,但我很确定这是我读到的,但在这种情况下,计时器不会帮助它运行,只要while循环runsjava.util.timer是在调度程序为其创建的线程上下文中执行的,它很可能不是EDT,因为它与Swing或AWT无关。Swing timer保证actionPerformed方法在EDT中执行,因此如果您要从计时器中与UI交互,那么您需要Swing TimerMapProgrammer谢谢您的回复,它们总是非常有用的。但是在这种情况下,我不确定我是否会调用SwingWorker?第二帧在用户选择输出路径后运行,并且在while循环之外,所以这肯定是一个进程吗?while循环仍然会阻塞UI。如果您打算从此循环与UI进行交互,SwingWorker是您的最佳选择,否则您将需要某种线程,但随后您会遇到回调问题并将其重新同步到UI,SwingWorker将为您解决此问题我无意与框架进行交互,它就像一个加载窗格,但只是告诉用户应用程序正在处理请求而已。您只需要知道循环何时完成。看一看swingutilites.invokeLater invokeLater方法似乎对我不起作用gif图像直到循环完成后才显示,但是现在显示的是文本
 final Processing nc = new Processing();
 nc.setVisible(true);
 Timer timer = new Timer():
 TimerTask task = new TimerTask() {
      public void run() { 
          nc.setVisible( false );
          // to do disposing nc
      }
 };
 timer.schedule( task, 1000 * 3 ); // dispose the processing frame after 3 minutes
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class LongRunningTask {

    public static void main(String[] args) {
        new LongRunningTask();
    }

    public LongRunningTask() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                new BackgroundWorker().start();

            }
        });
    }

    public class BackgroundWorker extends SwingWorker<Object, Object> {

        private JFrame frame;

        public BackgroundWorker() {
        }

        // Cause exeute is final :P
        public void start() {
            ImageIcon icon = new ImageIcon(getClass().getResource("/spinner.gif"));
            JLabel label = new JLabel("This might take some time");
            label.setIcon(icon);

            frame = new JFrame("Testing");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new GridBagLayout());
            frame.add(label);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);

            execute();
        }

        @Override
        protected Object doInBackground() throws Exception {

            System.out.println("Working hard...");
            Thread.sleep(1000 + (((int)Math.round(Math.random() * 5)) * 1000));
            System.out.println("Or hardly working...");

            return null;

        }

        @Override
        protected void done() {
            frame.dispose();
        }

    }
}