我想创建一条加载消息,在加载信息时会在屏幕上弹出。我将为它调用initLoadingPanel()方法,以便JFrame可见。我的问题是如何关闭它?
我的代码如下。
public class DataMigration extends JFrame{
private JFrame frmDataMigration;
private JFrame loader;
private JButton btnProcess;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
DataMigration window = new DataMigration();
window.frmDataMigration.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public DataMigration() {
initialize();
}
private void initialize() {
LoggerImp.startLog(CLASS_NAME, "initialize()");
frmDataMigration = new JFrame();
btnProcess = new JButton("Load");
btnProcess.setEnabled(false);
btnProcess.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
SwingWorker <CSV, CSV> worker = new SwingWorker<CSV, CSV>() {
@Override
protected CSV doInBackground() throws Exception {
return FileReaderCSVHelper.fileReader(dirName.getText(), fileName.getText());
}
@Override
protected void done() {
try {
csv = doInBackground();
generateTableList(csv.getCsvTitle(), stateController.getFieldNames());
} catch (ExecutionException ex) {
ex.printStackTrace();
} catch (Exception e){
}
loader.dispose();
}
};
worker.execute();
}
});
frmDataMigration.getContentPane().add(btnProcess);
}
public void initLoadingPanel(){
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
loader = new JFrame("Loading....");
ImageIcon img = new ImageIcon("loader.gif");
loader.add(new JLabel(" Loading...", img, JLabel.CENTER));
loader.setAlwaysOnTop(true);
loader.pack();
loader.setSize( 448, 497);
loader.setVisible(true);
loader.setLocationRelativeTo(null);
}
});
}
答案 0 :(得分:5)
通常情况下,您只需拨打loader.dispose()
或loader.setVisible(false)
即可,这就提出了如何加载资源的问题?
您可能需要将loader
的引用传递给代码的这一部分,所以当它完成后,您可以处置该帧。
因为框架是装饰的,所以用户可以简单地点击&#34; [x]&#34;按钮并关闭窗口,虽然您可以将defaultCloseOperation
设置为DO_NOTHING_ON_CLOSE
,但它仍然看起来很奇怪。
由于loader
从JFrame
延伸,用户仍然可以与父窗口进行交互(如果有可见),更好的解决方案可能是使用{{1}相反,让它成为模态。
您也可以考虑查看How to Create a Splash Screen了解其他一些想法
<强>更新强>
你正在掩盖你的变量......
首先,您将JDialog
声明为loader
DataMigration
然后在public class DataMigration extends JFrame{
//...
private JFrame loader;
的{{1}}方法中重新声明....
run
这意味着实例字段仍然为空,请尝试...
Runnable
,而不是...
也...
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame loader = new JFrame("Loading....");
不会做你认为应该做的事情......你&#34;可能&#34;幸运的是,SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
loader = new JFrame("Loading....");
框架会出现,但它很可能因为你阻止事件调度线程而赢了。
相反,您应该考虑使用public void actionPerformed(ActionEvent arg0) {
initLoadingPanel();
csv = FileReaderCSVHelper.fileReader(dirName.getText(), fileName.getText());
generateTableList(csv.getCsvTitle(), stateController.getFieldNames());
loader.dispose();
}
....
loader
(我不知道SwingWorker
是什么类型,所以我猜...
这将确保您的用户界面在加载数据时保持响应...
使用工作示例进行更新....
initLoadingPanel();
SwingWorker worker = new SwingWorker<CVS, CVS>() {
@Override
protected CVS doInBackground() throws Exception {
return FileReaderCSVHelper.fileReader(dirName.getText(), fileName.getText());
}
@Override
protected void done() {
try {
cvs = get();
generateTableList(csv.getCsvTitle(), stateController.getFieldNames());
} catch (ExecutionException ex) {
ex.printStackTrace();
}
loader.dispose();
}
};
worker.execute();