Ich arbeite derzeit an einer kleinen Anwendung zum Anzeigen/Speichern von Notizen. Der Inhalt jeder Notiz wird nach dem Schließen der Anwendung in einer .properties-Datei auf meiner Festplatte gespeichert. Wenn Sie die Anwendung erneut öffnen, werden alle Notizen in der Anwendung geladen.Java SwingWorker jetzt zu aktualisieren Modell
Während dieser Ladevorgang wird ein Dialogfeld mit einer Fortschrittsleiste angezeigt, die den Status des Prozesses angibt. Außerdem zeige ich eine GlassPane an, damit der Benutzer nicht mit der GUI interagieren oder Notizen während des Ladevorgangs speichern kann.
Es folgt mein aktueller-Code für das Laden der Noten:
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();
}
Ich bin sicher, dass meine Lösung ziemlich zackig ist. Nach einigen Nachforschungen stellte ich fest, dass es genau zu diesem Zweck eine Klasse namens "SwingWorker" gibt (Taks im Hintergrund laufen lassen und GUI aktualisieren) ABER, wie kann ich meine Notiz aus dem SwingWorker heraus erstellen (Note-Object zu meinem Model hinzufügen)?
Ich weiß, dass ich meine Fortschrittsleiste mit den Veröffentlichungs- und Prozessmethoden aktualisieren kann, aber wie kann ich ein Objekt mit dem SwingWorker erstellen?
Der Ladevorgang sollte für jede Note die folgende Routine tun:
lesen Inhalt von .properties-Datei -> erstellen note Object -> show note in JList -> update progressbar.
Verwenden Sie 'publish' /' process', um die geladene Notiz zu "publizieren", verwenden Sie einen 'PropertyChangeListener' nicht Monitor für den Fortschritt – MadProgrammer
Bitte siehe [Swing Worker Trail] (https://docs.oracle.com/javase/tutorial/ uiswing/concurrency/simple.html) – Sanjeev