Java弹出窗口在运行时冻结
我有一个奇怪的问题,我在java上制作了一个小软件,用来执行我在kettle中制作的一些作业。现在,转换进行得很顺利,一切正常,但是当我执行转换时,我希望在转换期间显示一条消息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
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