Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 语法错误行为_Java_Swing_Concurrency_Jdialog_Event Dispatch Thread - Fatal编程技术网

Java 语法错误行为

Java 语法错误行为,java,swing,concurrency,jdialog,event-dispatch-thread,Java,Swing,Concurrency,Jdialog,Event Dispatch Thread,我有上面的代码,它的用途是在一些代码执行时向用户显示一条消息(代码执行大约需要5-10秒,我不希望用户认为程序冻结) 问题是,添加到对话框中的JLabel根本不会出现。确切地说,无论我在对话框中添加了什么,它都不会出现 但是,如果我将JDialog设置为modal(将true作为上述构造函数的最后一个参数添加),它会出现,但是我想要执行的代码在对话框关闭之前不会运行,这违背了它的目的 由于它在代码中的位置,将要执行的代码实际上并不重要,我尝试将它保持在上面的状态—完全没有执行代码—对话框会在瞬间

我有上面的代码,它的用途是在一些代码执行时向用户显示一条消息(代码执行大约需要5-10秒,我不希望用户认为程序冻结)

问题是,添加到对话框中的JLabel根本不会出现。确切地说,无论我在对话框中添加了什么,它都不会出现

但是,如果我将JDialog设置为modal(将true作为上述构造函数的最后一个参数添加),它会出现,但是我想要执行的代码在对话框关闭之前不会运行,这违背了它的目的

由于它在代码中的位置,将要执行的代码实际上并不重要,我尝试将它保持在上面的状态—完全没有执行代码—对话框会在瞬间显示,但我可以看到它是空的

我知道我可以创建一个确认窗口并说“等待10秒,代码正在执行”,但我不想这样做

我还尝试将JDialog替换为JFrame,但文本仍然不会出现


我缺少什么?

如果长时间运行的任务是在
事件调度线程(EDT)上执行的,则在任务完成之前,对话框可能没有机会自行绘制/重新绘制。有关EDT的更多详细信息,请查看教程

下面是一个利用您的代码的示例,它演示了错误的对话框:

考虑通过在工作线程上执行长时间运行的任务来重构实现。例如,您可以使用

下面是一个演示,用一个简单的辅助程序演示了相同的对话框:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class TestDialog {

    private static void createAndShowGUI() {
        final JFrame frame = new JFrame("Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton button = new JButton("Execute");
        button.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                final JDialog dialog = new JDialog((JFrame)frame, "blabla");
                dialog.setLayout(new BorderLayout());
                JLabel label = new JLabel("more blabla");
                dialog.getContentPane().add(label, BorderLayout.CENTER);

                dialog.setSize(new Dimension(280, 80));
                dialog.setLocationRelativeTo(frame);
                dialog.setVisible(true);

                try {
                    Thread.sleep(3000);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }

                dialog.setVisible(false);
                dialog.dispose();
            }

        });

        frame.add(button);          
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JDialog;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.SwingWorker;
公共类TestDialogWithWorker{
私有静态void createAndShowGUI(){
最终JFrame=新JFrame(“演示”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton按钮=新JButton(“执行”);
addActionListener(新建ActionListener()){
@凌驾
已执行的公共无效操作(操作事件e){
新工作程序(frame.execute();
}
});
框架。添加(按钮);
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);
}
静态类工作程序扩展SwingWorker{
JDialog对话框;
公共工作者(JFrame家长){
dialog=newjdialog((JFrame)父级,“blabla”);
setLayout(新的BorderLayout());
JLabel标签=新的JLabel(“更多blabla”);
dialog.getContentPane().add(标签,BorderLayout.CENTER);
设置尺寸(新尺寸(280,80));
对话框。setLocationRelativeTo(父级);
对话框.setVisible(true);
}
@凌驾
受保护的Void doInBackground()引发异常{
睡眠(3000);
返回null;
}
@凌驾
受保护的void done(){
对话框.setVisible(false);
dialog.dispose();
试一试{
get();
}捕获(例外e){
e、 printStackTrace();
}
}
}
公共静态void main(字符串[]args){
javax.swing.SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
createAndShowGUI();
}
});
}       
}

1+显示了相当多的工作和一些非常漂亮的代码。谢谢。@kleopatra在这个演示案例中不太适用,但是如果不调用
get()
,您就不会知道
doInBackground()
中发生了异常。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class TestDialog {

    private static void createAndShowGUI() {
        final JFrame frame = new JFrame("Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton button = new JButton("Execute");
        button.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                final JDialog dialog = new JDialog((JFrame)frame, "blabla");
                dialog.setLayout(new BorderLayout());
                JLabel label = new JLabel("more blabla");
                dialog.getContentPane().add(label, BorderLayout.CENTER);

                dialog.setSize(new Dimension(280, 80));
                dialog.setLocationRelativeTo(frame);
                dialog.setVisible(true);

                try {
                    Thread.sleep(3000);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }

                dialog.setVisible(false);
                dialog.dispose();
            }

        });

        frame.add(button);          
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingWorker;

public class TestDialogWithWorker {

    private static void createAndShowGUI() {
        final JFrame frame = new JFrame("Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton button = new JButton("Execute");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new Worker(frame).execute();
            }

        });

        frame.add(button);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    static class Worker extends SwingWorker<Void, Void> {
        JDialog dialog;

        public Worker(JFrame parent) {
            dialog = new JDialog((JFrame) parent, "blabla");
            dialog.setLayout(new BorderLayout());
            JLabel label = new JLabel("more blabla");
            dialog.getContentPane().add(label, BorderLayout.CENTER);

            dialog.setSize(new Dimension(280, 80));
            dialog.setLocationRelativeTo(parent);
            dialog.setVisible(true);
        }

        @Override
        protected Void doInBackground() throws Exception {
            Thread.sleep(3000);
            return null;
        }

        @Override
        protected void done() {
            dialog.setVisible(false);
            dialog.dispose();

            try {
                get();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }       
}