Ich habe ein Statusfenster programmiert, in dem der aktuelle Arbeitsvorgang anzeigt werden soll. Dazu gibt es eine JProgressBar und eine JTextArea. Nur werden die leider erst angezeigt wenn bereits alle Arbeitsschritte im Hintergrund beendet wurden, dazwischen bleibt die GUI einfach grau, und der Rest der Programmoberfläche ist ebenfalls nicht ansprechbar.
Mein Problem ist dass ich bisher noch nicht die geringste Ahnung von Thread-Programmierung habe. Mir ist nur bekannt dass ein sogen. EventDispatcher-Thread für das Zeichnen der GUI-Komponenten zuständig ist.
Da ich das Programm für einen kommerziellen Zweck programmiere, möchte ich hier nicht den ganzen Programmcode posten. Die ProgressWindow-Klasse sieht so aus:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ProgressWindow extends JFrame {
protected String title;
protected int worksteps;
// GUI-Components
protected Point winCoords;
protected JProgressBar progressBar;
protected JTextArea progressField;
protected JButton close;
public ProgressWindow( String title, int worksteps, Point winCoords ) {
this.title = title;
this.worksteps = worksteps;
this.winCoords = winCoords;
this.init();
}
public void addFinishedWorkstep( final String message ) {
//Wert der Progressbar erhoehen
progressBar.setValue( progressBar.getValue()+1 );
progressBar.setString( (progressBar.getValue()*100/progressBar.getMaximum()) + " %" );
// Statusausgabe
String oldText = progressField.getText();
if ( oldText.isEmpty() )
progressField.setText( message );
else
progressField.setText( oldText + '
' + message );
}
public void finishProgress() {
if ( this.progressBar.getValue() < this.progressBar.getMaximum() ) {
if ( this.progressBar.getValue() == 0 )
this.progressField.setText( this.progressField.getText() + "Nothing to do ..." );
this.progressBar.setValue( this.progressBar.getMaximum() );
this.progressBar.setString( "100 %" );
}
this.progressField.setText( this.progressField.getText() + "
Finished!" );
this.unlockCloseButton();
}
protected void unlockCloseButton() {
this.close.setEnabled( true );
}
protected void init() {
this.setTitle( this.title );
this.setSize( 600, 370 );
this.setLocation( this.winCoords );
this.setResizable( false );
this.setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE );
this.setLayout( null );
this.progressBar = new JProgressBar( JProgressBar.HORIZONTAL, 0, this.worksteps );
this.progressBar.setStringPainted( true );
this.progressBar.setString( "0 %" );
this.progressBar.setBounds( 10, 10, this.getWidth()-25, 25 );
this.progressField = new JTextArea();
this.progressField.setEditable( false );
this.progressField.setWrapStyleWord( false );
this.progressField.setBackground( Color.WHITE );
JScrollPane progressPane = new JScrollPane( this.progressField );
progressPane.setBounds( 10, this.progressBar.getX()+this.progressBar.getHeight()+10, this.getWidth()-25, 250 );
this.close = new JButton( "Abschließen" );
this.close.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent ae ) {
setVisible( false );
dispose();
}
});
this.close.setEnabled( false );
this.close.setSize( 250, 25 );
this.close.setLocation( (this.getWidth()-this.close.getWidth())/2, progressPane.getX()+progressPane.getHeight()+50 );
this.add( this.progressBar );
this.add( progressPane );
this.add( this.close );
this.setVisible( true );
}
}```
Bis 25. Februar sollt ich zumindestens eine vorläufige Version des Programms präsentieren. Ich bin für jede Hilfe dankbar! :)
**EDIT:**
Ich habs jetzt mal mit der Observer-Klasse versucht, funktioniert aber leider auch nicht :(
```package gcomponents;
import java.awt.*;
import java.awt.event.*;
import java.util.Observable;
import java.util.Observer;
import javax.swing.*;
public class ProgressWindow extends JFrame implements Observer {
protected String title;
protected int worksteps;
// GUI-Components
protected Point winCoords;
protected JProgressBar progressBar;
protected JTextArea progressField;
protected JButton close;
public ProgressWindow( String title, int worksteps, Point winCoords ) {
this.title = title;
this.worksteps = worksteps;
this.winCoords = winCoords;
this.init();
}
public void addFinishedWorkstep( String message ) {
//Wert der Progressbar erhoehen
progressBar.setValue( progressBar.getValue()+1 );
progressBar.setString( (progressBar.getValue()*100/progressBar.getMaximum()) + " %" );
// Statusausgabe
String oldText = progressField.getText();
if ( oldText.isEmpty() )
progressField.setText( message );
else
progressField.setText( oldText + '
' + message );
}
public void finishProgress() {
if ( this.progressBar.getValue() < this.progressBar.getMaximum() ) {
if ( this.progressBar.getValue() == 0 )
this.progressField.setText( this.progressField.getText() + "Nothing to do ..." );
this.progressBar.setValue( this.progressBar.getMaximum() );
this.progressBar.setString( "100 %" );
}
this.progressField.setText( this.progressField.getText() + "
Finished!" );
this.unlockCloseButton();
}
protected void unlockCloseButton() {
this.close.setEnabled( true );
}
protected void init() {
this.setTitle( this.title );
this.setSize( 600, 370 );
this.setLocation( this.winCoords );
this.setResizable( false );
this.setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE );
this.setLayout( null );
this.progressBar = new JProgressBar( JProgressBar.HORIZONTAL, 0, this.worksteps );
this.progressBar.setStringPainted( true );
this.progressBar.setString( "0 %" );
this.progressBar.setBounds( 10, 10, this.getWidth()-25, 25 );
this.progressField = new JTextArea();
this.progressField.setEditable( false );
this.progressField.setWrapStyleWord( false );
this.progressField.setBackground( Color.WHITE );
JScrollPane progressPane = new JScrollPane( this.progressField );
progressPane.setBounds( 10, this.progressBar.getX()+this.progressBar.getHeight()+10, this.getWidth()-25, 250 );
this.close = new JButton( "Abschließen" );
this.close.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent ae ) {
setVisible( false );
dispose();
}
});
this.close.setEnabled( false );
this.close.setSize( 250, 25 );
this.close.setLocation( (this.getWidth()-this.close.getWidth())/2, progressPane.getX()+progressPane.getHeight()+50 );
this.add( this.progressBar );
this.add( progressPane );
this.add( this.close );
this.setVisible( true );
}
public void update( Observable obs, Object o ) {
//System.out.println( o );
this.addFinishedWorkstep( (String) o );
this.repaint();
}
}```
Aufruf aus der "Arbeiterklasse":
```protected void setProgressMessage( final String message ) {
if ( this.progressWindow != null ) {
/*SwingUtilities.invokeLater( new Runnable(){
public void run() {
progressWindow.addFinishedWorkstep( message );
}
} );*/
this.setChanged();
this.notifyObservers( message );
} else {
System.out.println( message );
}
}```