beim Programmstart sammle ich einige Daten und stelle diese dann in einer JTable zur weiteren Bearbeitung dar.
Da das Einholen der Daten etwas an Zeit kostet und nach der derzeitigen Umsetzung dadurch der Programmaufbau beim Benutzer einen vielleicht unkonfortablen Eindruck erweckt würde ich gerne wissen, wie ich das verbessern kann.
Main:
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
NxUserCheck frame = new NxUserCheck();
frame.setVisible(true);
NxDBQuery db = new NxDBQuery();
db.openDBConnection();
db.getQuery();
db.closeDBConnection();
textFieldFound.setText(Integer.toString(getRows().size()));
} catch (Exception e) {
e.printStackTrace();
log.error(e.getLocalizedMessage());
}
}
});
}```
Ich würde gerne eine ProgressBar oder einen Dialog mit ProgressBar darstellen.
Ich denke, dazu müsste ich die Zeilen
``` NxDBQuery db = new NxDBQuery();
db.openDBConnection();
db.getQuery();
db.closeDBConnection();```
in einen Thread stecken und die ProgressBar in einem parallelen Thread ablaufen lassen...
Ich habe für leider noch keine passende Lösung für den Programmstart gefunden und wäre für Ideen dankbar.
GGK
in einen Thread stecken und die ProgressBar in einem parallelen Thread ablaufen lassen…[/quote]
Ja genau, das ist der richtige Ansatz. Du musst nicht zwingend auf einen plain Thread zurückgreifen, als Alternative kannst du auch einen SwingWorker nutzen. Da hast du dann auch die Möglichkeit den Fortschritt an beispielsweise eine ProgressBar zu übergeben.
Es genügt wenn du dir einen Thread für die DBQuery erstellst. Für alles andere bringt Java schon Threads mit (main Thread, EDT).
Ein einfaches Beispiel mit einer ProgressBar kann bspw. so aussehen;
public class Main
{
private static JProgressBar progressBar;
public static void main(String[] args) throws Exception
{
EventQueue.invokeLater(new Runnable() {
public void run()
{
JFrame frame = new JFrame("ProgressBar Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
progressBar = new JProgressBar();
progressBar.setPreferredSize(new Dimension(100, 20));
progressBar.setMinimum(0);
progressBar.setMaximum(100);
final JButton button = new JButton("What's the Answer to the Ultimate Question of Life, the Universe, and Everything?");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e)
{
// start the task
final AnswerWorker worker = new AnswerWorker();
worker.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent event)
{
switch (event.getPropertyName()) {
case "progress":
progressBar.setIndeterminate(false);
progressBar.setValue((Integer) event.getNewValue());
break;
case "state":
switch ((StateValue) event.getNewValue()) {
case DONE:
try {
int answer = worker.get();
button.setText("The answer is " + answer);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
break;
}
}
}
});
worker.execute();
}
});
frame.add(button, BorderLayout.NORTH);
frame.add(progressBar, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);
}
});
}
private static class AnswerWorker extends SwingWorker<Integer, Void>
{
@Override
protected Integer doInBackground() throws Exception
{
Random rand = new Random();
for (int i = 0; i < 100; i++) {
Thread.sleep(rand.nextInt(100) + 50);
setProgress(i);
}
return 42;
}
}
}
[QUOTE=GGK]ich brauche dann aber drei Threads…oder?
1er: JFrame
2er: ProgressBar
3er: DBQuery
GGK[/QUOTE]
1 und 2 in den EDT (invokeLater()).
Implementierung der Anfrageab/bearbeitung ist Sache der DB, der Progger hat bis auf die Wahl und Formulierung der Anfrage keinen Einfluss hierauf/darauf.
Afaik iirc imho verkürzt eine Fortschrittsanzeige die gefühlte Zeitspanne, kann aber auch süchtig machen.