JDialog friert bei Operationsaufruf ein.

A

Annun

Hallo zusammen.

Ich habe das Problem, dass in einem JFrame über einen Button eine Aktion mit gleichzeitiger Dialogeinblendung aufrufen möchte. Der Dialog ist ein JDialog mit Fortschrittsbalen, der über die Operation public void setIndeterminate(boolean newValue) eine ständige Animation erzeugen soll.

Im JFrame zeichne ich den Dialog und rufe ihn auf. Dannach rufe ich die gewünschte Operationa uf und danach ein setVisible(false) und dispose() auf den JDialog.

Das Problem ist, dass der Bildschrim einfriert, wenn die Operation aufgerufen wird. Das ist auch soweit klar, da der Event Dispatcher der GUI schlafengelgt wird, nur dachte ich das könne man durch nen seperaten Thread für die aufzurufende Operation verweiden.

Code:
   private void jButtonAktionActionPerformed(java.awt.event.ActionEvent evt) {
...
ProcessDialog einWarteFenster = new ProcessDialog(this,false);
einWarteFenster.setVisible(true);
...
EigenerThread einThread = new EigenerThread();
    		try{
    			einThread.run();	
    		}catch(Exception e){
    			einWarteFenster.setVisible(false);
    			einWarteFenster.dispose();
    			throw new Exception(e.getMessage());
    		}


.. 
}

Hat jemand eine Idee ?

Gruss Annun
 
Zuletzt bearbeitet von einem Moderator:
Hallo Annung,

da scheinen einige Fehler drin zu sein. Beispielsweise startet man einen Thread nicht mir run() sondern mit start(). Wenn du doch run() verwendest wird dieser nicht in einem neuen Thread gestartet. Ebenso was sucht die Startanweisung des Threads im Thread selber?

Das wäre ein vollständiges, ausführbares Beispiel:
Java:
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigInteger;

import javax.swing.*;

public class ProgressDemo extends JFrame implements ActionListener {

	private static int max = 555;

	private int status = 0;

	private JButton btn = new JButton("Calculate all factorials till ");

	private JTextField tf = new JTextField(4);

	private JPreviewDialog previewDialog = new JPreviewDialog(this);

	private JProgressDialog progDialog;

	public ProgressDemo() {
		super("Progress Demo");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLocationByPlatform(true);
		this.setAlwaysOnTop(true);

		btn.addActionListener(this);
		tf.setText("" + max);

		this.setLayout(new FlowLayout());
		this.add(btn);
		this.add(tf);

		this.pack();
		this.setVisible(true);
	}

	public static void main(String[] args) {
		new ProgressDemo();
	}

	public void actionPerformed(ActionEvent e) {

		try {
			int temp = Integer.valueOf(tf.getText());
			max = temp;
		} catch (NumberFormatException nfe) {
			System.out.println(nfe.getMessage());
		}

		previewDialog.clearTextArea();
		progDialog = new JProgressDialog(this, max);

		new Thread() {
			public void run() {
				progDialog.showDialog();

				for (long i = 0; i <= max; i++) {
					previewDialog.updateTextArea("factorial of " + i + ": "
							+ ProgressDemo.this.getFactorial(i).toString()
							+ "\n");
					status = (int) i;
					SwingUtilities.invokeLater(new Runnable() {
						public void run() {
							progDialog.setProgStatus(status);
						}
					});
				}
				progDialog.disposeDialog();
				previewDialog.showDialog();
			}
		}.start();
	}

	public BigInteger getFactorial(long n) {
		BigInteger bi = new BigInteger("1");
		if (n == 0)
			return bi;
		for (long i = 1; i <= n; i++) {
			bi = bi.multiply(new BigInteger("" + i));
		}
		return bi;
	}

	class JPreviewDialog extends JDialog {

		private JTextArea tArea = new JTextArea();

		public JPreviewDialog(JFrame owner) {
			super(owner, "MyDialog", true);
			this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
			this.setLocationByPlatform(true);
			this.setSize(480, 320);

			tArea.setEditable(false);

			this.add(new JScrollPane(tArea), BorderLayout.CENTER);
			this.add(btn, BorderLayout.SOUTH);
		}

		public void showDialog() {
			this.setVisible(true);
		}

		public void updateTextArea(String s) {
			tArea.append(s);
		}

		public void clearTextArea() {
			tArea.setText("");
		}
	}

	public class JProgressDialog extends JDialog {
		private int max = 20;

		private JProgressBar bar;

		public JProgressDialog(JFrame owner, int max) {
			super(owner, "Fortschritt...", false);
			this.max = max;

			bar = new JProgressBar(0, max);

			this.setAlwaysOnTop(true);
			this.setLocationByPlatform(true);
			this.setSize(300, 50);
			this.add(bar);
		}

		public void showDialog() {
			bar.setValue(0);
			bar.setIndeterminate(false);
			this.setVisible(true);
		}

		public void disposeDialog() {
			this.dispose();
		}

		public void setProgStatus(int stat) {
			if (stat < (double) max * 0.90)
				bar.setValue(stat);
			else if (!bar.isIndeterminate())
				bar.setIndeterminate(true);
		}

		public int getProgStatus() {
			return bar.getValue();
		}
	}
}


Vg Erdal
 
Danke, das wars. Ich hatte meinen Thread völlig falsch gestartet und so die GUI eingefroren.

THX Annun.
 
Zurück