Programmstart: Datensammeln beim Programmstart im Hintergrund ablaufen lassen

Hallo,

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

[quote=GGK]Ich denke, dazu müsste ich die Zeilen

Java Code:

                    • NexusDBQuery db = new NexusDBQuery();
                    • db.openDBConnection();
                    • db.getQuery();
                    • db.closeDBConnection();

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.

http://docs.oracle.com/javase/tutorial/uiswing/components/progress.html ab der Mitte wirds richtig interessant: “How to Use Progress Monitors”.

bye
TT

Die ProgressBar kann ich aber in einem Thread ebenso nutzen…

ich brauche dann aber drei Threads…oder?

1er: JFrame
2er: ProgressBar
3er: DBQuery

GGK

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;
		}
	}
}

Macht eine Progressbar hier überhaupt Sinn? Die DB-Abfrage müsste dazu nämlich in der Lage sein, einen Wert zu liefern, wie lange diese dauern möchte.

eine ProgressBar mit Intermediate=true macht schon Sinn

Ok, übergeredert.

[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.

Der Link von TT von oracle ist immer jut.