JDialog und SwingUtilities

Status
Nicht offen für weitere Antworten.

Sanix

Top Contributor
Hi,
Ich habe eine Klasse welche von einem JDialog erbt. Um die Komponenten darin zu aktualisieren verwende ich immer einen Thread der mit SwingUtilities.invokeLater aufgerufen wird. Diesen JDialog instanzieren ich von einem JFrame aus, wo ich auch die einzelnen Methoden benutze. Es funktioniert alles gut, ausser wenn ich den Dialog auf modal setze. Und ich verstehe nicht warum. Sowieso dieses ganze nervige invokeLater, dann hat man schlussendlich 100 Threads, nur damit das GUI sauber upgedatet wird und nicht einfriert.
 

javimka

Top Contributor
Das invokeLater startet keinen neuen Thread, wenn du das nicht selber im Runnable geschrieben hast. Das wäre wohl auch eher verkehrt. Das invokeLater übergibt der EventQueue einen weiteren Job, der ausgeführt wird, sobald alle vorherigen Jobs abgearbeitet sind.
Was genau passiert denn, wenn du den JDialog modal setzt? Kannst du ein Beispiel posten, wo dieser Fehler reproduzierbar ist?
 

Sanix

Top Contributor
Das invokeLater erwartet aber ein Runnable, welches als Thread gedacht ist.

Java:
public class ProgressWindow extends JDialog {

	/** unique ID for serialization */
	private static final long serialVersionUID = 255284650387076779L;
	
	/** Showing the progress */
	private JProgressBar progress;

	/** Label showing additional information */
	private JLabel jlStatus;

	/** Box showing buttons */
	private Box buttonBox, progressBarBox, labelBox;
	
	/**
	 * Member implicating if file correction is on hold
	 */
	private boolean paused = false;
	
	/**
	 * Member implicating if file correction must be cancelled
	 */
	private boolean running = true;
	/**
	 * Status before pause is stored here
	 */
	private String lastStatus;
	
	/**
	 * Progress window
	 *
	 * @param owner {@link JFrame} 
	 * @param title {@link String} 
	 */
	public ProgressWindow(JFrame owner, String title) {
		super(owner, title, false);

		//Init GUI
		setSize(500, 140);
		setLocationRelativeTo(owner);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));

		//Current file
		jlStatus = new JLabel();
		labelBox = Box.createHorizontalBox();
		labelBox.add(jlStatus, Box.CENTER_ALIGNMENT);
		add(labelBox);

		//Progress bar
		progress = new JProgressBar();
		progress.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
		progress.setValue(0);
		progress.setStringPainted(true);
		progressBarBox = Box.createHorizontalBox();
		progressBarBox.add(progress, Box.CENTER_ALIGNMENT);
		add(progressBarBox);



		//Buttons
		JButton cancel = new JButton("Cancel");
		cancel.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				running = false;
			}
		});
		final JButton pause = new JButton("Pause");
		pause.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				if (e.getActionCommand().equals("Pause")) {
					pause.setText("Continue");
					setPaused(true);
				} else {	// Continue
					pause.setText("Pause");
					setPaused(false);
				}
			}
		});
		buttonBox = Box.createHorizontalBox();
		buttonBox.add(pause, Box.RIGHT_ALIGNMENT);
		buttonBox.add(cancel, Box.LEFT_ALIGNMENT);
		add(buttonBox);

		setVisible(true);		
	}
	
	/**
	 * Shows that action has been finished
	 */
	public void showFinish() {
		//Show finish
		buttonBox.removeAll();
		JButton finish = new JButton("Finished");
		finish.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				ProgressWindow.this.dispose();
			}
		});
		buttonBox.add(finish);
		//Force refresh
		setSize(500, 141);
	}
	
	/**
	 * Set value for progress bar
	 * @param value 0-100
	 */
	public void showProgress(final int value) {
		try {
			SwingUtilities.invokeLater(new Runnable() {
				@Override
				public void run() {
					progress.setValue(value);
				}
			});
		} catch (Exception e) {
			// do nothing
		}
	}

	
	/**
	 * Calculates the progress in a range from 0-100
	 * @param current current value
	 * @param all total
	 */
	public void showProgress(int current, int all) {
		showProgress((int) ((double) (current + 1) / all * 100d));
	}
	
	/**
	 * Set status
	 * @param status String
	 */
	public void setStatus(final String status) {
		try {
			SwingUtilities.invokeLater(new Runnable() {
				@Override
				public void run() {
					jlStatus.setText(status);
				}
			});
		} catch (Exception e) {
			// do nothing
		}
	}
	
	/**
	 * Pause the current thread with busy waiting
	 */
	public void doPauseIfNeeded() {
		//Paused?
		while (paused) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e1) {
				//do nothing
			}
		}
	}
	
	/**
	 * Getter for paused
	 * @return true if paused
	 */
	public boolean isPaused() {
		return paused;
	}

	/**
	 * Setter for paused
	 * @param paused true if paused
	 */
	public void setPaused(boolean paused) {
		if(paused) {
			lastStatus = jlStatus.getText();
			setStatus("Paused");
		} else {
			setStatus(lastStatus);
		}
		this.paused = paused;
	}

	/**
	 * Getter for running
	 * @return false if must be canceled
	 */
	public boolean isRunning() {
		return running;
	}

	/**
	 * Setter for running
	 * @param running true, if running
	 */
	public void setRunning(boolean running) {
		this.running = running;
	}	
}

Aufruf hier:

Java:
		new Thread() {
			@Override
			public void run() {
				//Show progress
				ProgressWindow pWindow = new ProgressWindow(ReportCleaner.this, "Scanning files...");
				pWindow.setStatus("Crawling files...");
			

...
				if (!variableContent) {
					for (int i = 0; i < size && pWindow.isRunning(); i++) {
						//File and progress
						File f = fileList.get(i);
						pWindow.showProgress(i, size);
						
						// adds all the variables
						variableList.addAll(reportFileReader.getReport(f).getVariables());

						//force the garbage collector to start. This keeps the memory usage low
						// start every 100 files
						if (counter++ > 100) {
							counter = 0;
							addToUnsortedList(false);
							Runtime.getRuntime().gc();
						}
						
						//Paused?
						pWindow.doPauseIfNeeded();
					}
					
					//this method adds all the data contained in the variableList.
					try {
					SwingUtilities.invokeAndWait(new Runnable() {
						
						@Override
						public void run() {	
							addToUnsortedList(true);
						}
					});
					} catch(Exception ex) {
						//do nothing
					}

				} else {
					int x = 0;
					for (int i = 0; i < size && pWindow.isRunning(); i++) {
						//File and progress
						File f = fileList.get(i);
						pWindow.showProgress(i, size);
...

					//this method adds all the data contained in the variableList.
					try {
					SwingUtilities.invokeAndWait(new Runnable() {
						
						@Override
						public void run() {	
							//add all the variables as keys into the modelMap, set mapped RuleTreeModels to null
							for (String s : variableMap.keySet()) {
								modelMap.put(s, null);
							}

							//add data for suggest field
							sfm.addAll(variableMap.keySet());
							suggestField.setSuggestData(sfm);
						}
					});
					} catch(Exception ex) {
						//do nothing
					}
					
				}
				
				//Show that action has been finished -> Close window
				pWindow.dispose();
			}
		}.start();
 

Ein Keks

Bekanntes Mitglied
Runnable sieht ungefähr so aus:
Java:
public interface Runnable{
  public abstract void run();
}
da is nix zu sehn von nem Thread^^
 

Sanix

Top Contributor
ok, ich habe die Javadoc falsch interpretiert. Meine Frage steht aber noch immer im Raum...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Jdialog nur 1x anzeigen Java Basics - Anfänger-Themen 2
D JButton in JDialog mit Action belgen Java Basics - Anfänger-Themen 6
J JDialog Zugriff auf parent JDialog Java Basics - Anfänger-Themen 5
J JDialog: wie kann ich ihn direkt als invisible erstellen Java Basics - Anfänger-Themen 7
A JDialog öffnet sich nicht Java Basics - Anfänger-Themen 7
D JDialog schließen Java Basics - Anfänger-Themen 11
I Veränderungen am JPanel vom JDialog aus Java Basics - Anfänger-Themen 6
H JDialog Problem Java Basics - Anfänger-Themen 10
H Problem JDialog.setVisible Java Basics - Anfänger-Themen 3
T Modales JDialog schliessen mit JButton Java Basics - Anfänger-Themen 2
I JDialog Problem Java Basics - Anfänger-Themen 37
J Icon JDialog mit Java 1.4 Java Basics - Anfänger-Themen 2
M JDialog Modality Java Basics - Anfänger-Themen 7
S JDialog resize zur Laufzeit PROBLEM!!! Java Basics - Anfänger-Themen 5
H Modalen JDialog schließen, ohne dabei das Parent-Frame zu schließen Java Basics - Anfänger-Themen 7
M JDialog soll was an die AufruferKlasse zurück geben Java Basics - Anfänger-Themen 3
S Layout JDialog Java Basics - Anfänger-Themen 9
S eigene Methoden in JDialog Java Basics - Anfänger-Themen 13
pun Im JDialog auf Objekt im Parent JFrame zugreifen Java Basics - Anfänger-Themen 2
C Frame, JFrame, JDialog Java Basics - Anfänger-Themen 12
S Datenzugriff auf JDialog! Java Basics - Anfänger-Themen 8
A JDialog, Owner JFrame ZIEL: nciht in der taskbar Java Basics - Anfänger-Themen 9
E Übergabe von werten aus einem JDialog Java Basics - Anfänger-Themen 4
B Grafiken/Bilder mit Netbeans in Jdialog Java Basics - Anfänger-Themen 7
O Beim Schließen JDialog, im Frame-Owner eine Methode starten Java Basics - Anfänger-Themen 6
G JDialog + p aintComponent-Override Java Basics - Anfänger-Themen 3
A Klasse erbot von JDialog. Kontruktor? Java Basics - Anfänger-Themen 4
M Hauptfenster nicht wählbar bei offenem JDialog Java Basics - Anfänger-Themen 2
G Bei JDialog warten Java Basics - Anfänger-Themen 5
B Fenstergröße variiert bei JDialog.pack()-Aufruf Java Basics - Anfänger-Themen 10
S JDialog während automatischer Dateisuche einblenden Java Basics - Anfänger-Themen 6
J JDialog zeigt nichts an Java Basics - Anfänger-Themen 4
C JDialog Werte nach Frame übergeben Java Basics - Anfänger-Themen 10
G JDialog + setOpaque Java Basics - Anfänger-Themen 5
G JDialog auf Jpanel statt Frame? Java Basics - Anfänger-Themen 4
N Werte von JDialog entgegennehmen Java Basics - Anfänger-Themen 7
G JDialog-Status im Frame abfragen Java Basics - Anfänger-Themen 2
Bernasconi dynamisches JDialog Java Basics - Anfänger-Themen 2
T Register im JDialog Java Basics - Anfänger-Themen 9
G JDialog übers X schliessen und Programm beenden Java Basics - Anfänger-Themen 4
C Fehlermeldungen umleiten auf JDialog Java Basics - Anfänger-Themen 2
S new .() extends JDialog {.} Java Basics - Anfänger-Themen 15
M Button in einem JDialog mit Enter ausführen Java Basics - Anfänger-Themen 2
C FocusLost reagiert nicht bei JDialog Java Basics - Anfänger-Themen 5
E Von einem JDialog einen neuen JDialog aufrufen Java Basics - Anfänger-Themen 10
R JDialog schließen ( nicht mit dispose()! ) Java Basics - Anfänger-Themen 14
G JDialog Java Basics - Anfänger-Themen 15
M JDialog Java Basics - Anfänger-Themen 3
M JDialog basierend auf JDialog aufrufen Java Basics - Anfänger-Themen 4
B KeyListener beim JDialog Java Basics - Anfänger-Themen 4
E JDialog schließen Java Basics - Anfänger-Themen 9
S JDialog Frage Java Basics - Anfänger-Themen 2
G Wiedermal vererbung, extends JDialog extends Exception ? Java Basics - Anfänger-Themen 8
P JDialog funktioniert nicht? Java Basics - Anfänger-Themen 9
P JDialog & JProgressBar Java Basics - Anfänger-Themen 2
F JDialog per Button-Klick schliessen Java Basics - Anfänger-Themen 2
S JDialog einrichten Java Basics - Anfänger-Themen 4
G Owner von JDialog;Komme einfach nicht weiter Java Basics - Anfänger-Themen 4
G einfaches jdialog beispiel Java Basics - Anfänger-Themen 1
J Default Button bei jDialog Java Basics - Anfänger-Themen 2
M JDialog mit TextArea Java Basics - Anfänger-Themen 2
K JDialog aus einer anderen klasse einfügen Java Basics - Anfänger-Themen 2
S Auf JDialog aus anderer Datei zugreifen Java Basics - Anfänger-Themen 5
I SwingUtilities.invokeLater - Wie verwenden für meinen Code? Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben