Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.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_Popup_Jframe_Freeze - Fatal编程技术网

Java弹出窗口在运行时冻结

Java弹出窗口在运行时冻结,java,swing,popup,jframe,freeze,Java,Swing,Popup,Jframe,Freeze,我有一个奇怪的问题,我在java上制作了一个小软件,用来执行我在kettle中制作的一些作业。现在,转换进行得很顺利,一切正常,但是当我执行转换时,我希望在转换期间显示一条消息 public Wait(){ setTitle("Aggiungi nuovo autore"); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); Toolkit toolkit = Toolkit.getDefaultToo

我有一个奇怪的问题,我在java上制作了一个小软件,用来执行我在kettle中制作的一些作业。现在,转换进行得很顺利,一切正常,但是当我执行转换时,我希望在转换期间显示一条消息

public Wait(){
    setTitle("Aggiungi nuovo autore");
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    Toolkit toolkit = Toolkit.getDefaultToolkit();
    Dimension screen = toolkit.getScreenSize();
    setBounds((screen.width/2)-150, (screen.height/2)-90, 300, 180);
    setResizable(false);
    setDefaultLookAndFeelDecorated(false);
    setContentPane(new Inner());
    setResizable(false);
    setUndecorated(true);
    setVisible(true);
}

public class Inner extends JPanel{
    BufferedImage image;
    public Inner(){
        BoxLayout box = new BoxLayout(this,BoxLayout.PAGE_AXIS);
        setLayout(box);
        JTextPane text = new JTextPane();
        text.setText("Attendere il completamento delle operazioni, potrebbe richiedere tempo");
        text.setOpaque(false);
        StyledDocument doc = text.getStyledDocument();
        SimpleAttributeSet center = new SimpleAttributeSet();
        StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
        doc.setParagraphAttributes(0, doc.getLength(), center, false);
        ImageIcon icon = new ImageIcon("extra/loading.gif");
        JLabel label = new JLabel (icon);
        add(Box.createRigidArea(new Dimension(0,20)));
        add(label);
        add(Box.createRigidArea(new Dimension(0,20)));
        add(text);
        Border border = BorderFactory.createLineBorder(java.awt.Color.DARK_GRAY, 3);
        setBorder(border);
    }
}
}
我在控制器的这一部分运行它

public void actionPerformed(ActionEvent e){
            aggiungi.setEnabled(false);
            Wait wait = new Wait();
            wait.toFront();
            for (int i=0; i<model.effectivilyCount();i++){
                int removed = 0;
                int c = executeCommand(model.getValueAt(i, 0),model.getValueAt(i,1));
                if (c==0) {
                    model.removeRow(removed);
                    model.fireTableDataChanged();
                }
                else if (c==1) ;//errore fatale da implementare
                else if (c==2) ; //segna di rosso e lascia stare nella tabella
            }
            wait.dispose();
            aggiungi.setEnabled(true);
        }
public void actionPerformed(ActionEvent e){
aggiungi.setEnabled(false);
等待=新的等待();
等等,toFront();

对于(int i=0;i您遇到了一个线程问题,可能是由executeCommand方法引起的。您在Swing事件线程上调用它,它会占用线程,使GUI无响应。最好将其放在后台线程中,如SwingWorker提供的线程中


此外,看起来您正在显示可能是JFrame的第二个窗口。如果是这样,您最好显示一个模式对话框,因为模式部分将使主窗口处于非活动状态,直到对话框不再可见。

我正在从控制器运行excecuteCommand(aggiungi和Wait是两个不同的类).我要试试另一种线的水壶:)@Neo87:涉及到什么类并不重要,因为对你的错误行为真正重要的是调用它的线程。如果你使用后台线程,一定要注意确保Swing调用是在Swing事件线程上进行的。我想我理解你想说的。我的错误行为是,如果我这样调用,我会锁定ev所以,很可能,一个好的解决办法是创建一个小线程来调用这个巨大的水壶transforms@Neo87:是的,类似这样的。SwingWorker将帮助您创建此后台线程,同时使数据更容易以安全的方式传输回Swing GUI。您是一个天才,我做了一点提示ad通过同一个MiniController实例运行kettle转换并停止等待窗口,它工作正常:D