【发布时间】:2016-04-12 15:44:57
【问题描述】:
我目前正在开发一个小应用程序来显示/保存笔记。关闭应用程序后,每条笔记的内容都存储在我硬盘上的 .properties 文件中。如果您再次打开应用程序,则所有笔记都将加载到应用程序中。
当这个加载过程发生时,我会显示一个带有进度条的对话框,指示过程的状态。此外,我显示了一个 GlassPane,因此用户在加载时无法与 GUI 交互或创建/保存笔记。
以下是我当前加载笔记的代码:
public void load() {
new Thread() {
@Override
public void run() {
Properties data = new Properties();
FileInputStream iStream = null;
File[] files = sortPairs();
int fileIndex = -1;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
pnlGlass = new MyGlassPane();
infoText = new JTextField();
progBar = new JProgressBar(0,100);
progBar.setValue(0);
progBar.setStringPainted(true);
infoBox = new LoadInfoDialog(infoText,progBar);
infoBox.setLocationRelativeTo(gui);
infoBox.setVisible(true);
infoBox.setDefaultCloseOperation(infoBox.DO_NOTHING_ON_CLOSE);
pnlGlass.setOpaque(false);
pnlGlass.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent me) {
me.consume();
}
});
gui.setGlassPane(pnlGlass);
pnlGlass.setVisible(true);
pnlGlass.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
}
});
for (File file : files) {
if (file.isFile()) {
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
iStream = new FileInputStream(file);
data.load(iStream);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (!(iStream == null)) {
try {
iStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
String title = data.getProperty("title");
String text = data.getProperty("text");
String erstellt = data.getProperty("date");
String fileName = data.getProperty("filename");
Note note = new Note(text, title);
note.setFileName(fileName);
note.setDate(erstellt);
fileIndex++;
final int fileIndexFinal = fileIndex;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
progBar.setValue(progBar.getValue() + 100 / fileCount);
infoText.setText("Lade Notizen, bitte warten..." + progBar.getValue() + "%");
noteModel.addNote(note);
System.out.println("Index:" + fileIndexFinal);
}
});
}
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
pnlGlass.setVisible(false);
infoBox.setVisible(false);
}
});
}
}.start();
}
我确信我的解决方案相当粗糙。经过一些研究,我发现有一个名为“SwingWorker”的类正是为了这个目的(在后台运行 Taks 并更新 gui)但是,我怎样才能从 SwingWorker 中创建我的笔记(将 Note-Object 添加到我的模型中)?
我知道我可以使用 publish 和 process 方法更新我的进度条,但是如何使用 SwingWorker 创建一个对象?
加载过程应为每个音符执行以下例程:
从 .properties 文件中读取内容 -> 创建注释对象 -> 在 JList 中显示注释 -> 更新进度条。
【问题讨论】:
-
使用
publish/process“发布”加载的笔记,使用PropertyChangeListener不监控进度