package Auswertung;
import java.io.*;
import java.lang.reflect.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import org.jfree.ui.*;
import Methoden.*;
import MyComponents.*;
public class Exportieren extends JFrame implements Runnable {
/** Der Algorithmus, der ausgeführt werden soll */
private Algorithmus algorithmus;
/** Der Fortschrittsbalken */
private JProgressBar progress;
/** Verschiedene Knöpfe um den Algorithmus zu steuern */
private JButton buttonStart, buttonStop;
public Exportieren(int t, int azm, FileManagement ergebnis,
JPanel HG, JPanel inner_layer) {
this.t = t;
this.azm = azm;
this.ergebnis = ergebnis;
this.HG = HG;
this.innerLayer = inner_layer;
{
try {
jbInit();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
public void jbInit() throws Exception {
innerLayer.setVisible(false);
innerLayer.removeAll();
innerLayer.setVisible(true);
innerLayer.setBackground(new MyColor("weiss").getMyColor());
progress = new JProgressBar();
buttonStart = new JButton( "Start" );
buttonStop = new JButton( "Stop" );
algorithmus = new Algorithmus();
// Wenn der Algo nicht läuft, kann man ihn auch nicht stoppen
buttonStop.setEnabled( false );
// Der folgende Teil ist nur für das Auge, eine Benutzeroberfläche die
// etwas dynamisch ist, kommt immer gut an.
JPanel panel = new JPanel( new GridLayout( 1, 2 ));
panel.add( buttonStart );
panel.add( buttonStop );
innerLayer.add( progress, new GridBagConstraints( 0, 0, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets( 2, 2, 2, 2 ), 0, 0) );
innerLayer.add( panel, new GridBagConstraints( 0, 1, 1, 1, 1.0, 1.0, GridBagConstraints.SOUTHEAST, GridBagConstraints.NONE, new Insets( 2, 2, 2, 2 ), 0, 0) );
HG.add(innerLayer, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
HG.updateUI();
// Die Buttons sollen ja auch reagieren können
buttonStart.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent e) {
start();
}
});
buttonStop.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent e) {
stop();
}
});
setDefaultCloseOperation( EXIT_ON_CLOSE );
}
/**
* Startet den Algorithmus, das Verhalten ist nicht definiert, wenn der
* Algorithmus bereits aktiviert wurde.
*/
protected void start(){
buttonStart.setEnabled( false );
// Einen neuen Thread herstellen, und starten.
new Thread( this ).start();
buttonStop.setEnabled( true );
}
/**
* Stoppt den Algorithmus, immer unter der Annahme, dass er zurzeit
* läuft.
*/
protected void stop(){
buttonStop.setEnabled( false );
algorithmus.setInterrupted( true );
}
/**
* Die Methode wird aus einem Zusatzthread aufgerufen. Sie startet
* den Algorithmus, und sorgt nach seiner Beendigung dafür, dass das
* Fenster weiterhin schön aussieht
*/
public void run(){
// Zurzeit ist der Algorithmus nicht unterbrochen
algorithmus.setInterrupted( false );
// Den Algorithmus starten. Die Methode kehrt erst zurück, wenn der
// Algo abgearbeitet oder unterbrochen wurde.
algorithmus.run( progress );
if( algorithmus.isInterrupted() ){
/*
* Sollte der Algorithmus abgebrochen worden sein, wird die
* Progressbar zurück auf den Startwert gesetzt.
*
* Die Methode "invokeLater" garantiert, dass dass der Code des
* übergebenen Runnable's synchronisiert zum Dispatch-Thread
* ausgeführt wird. Dies ist notwendig, weil Swing nicht
* threadsicher ist.
*/
SwingUtilities.invokeLater( new Runnable(){
public void run(){
progress.setMinimum( 0 );
progress.setMaximum( 1 );
progress.setValue( 0 );
buttonStart.setEnabled( true );
}
});
}
else{
/*
* Der Algorithmus wurde korrekt beendet, ein Dialog soll den
* Benutzer unterrichten, dass das Programm nun geschlossen wird.
*
* Die Methode "invokeAndWait" garantiert, dass der Code des
* Runnable-Objektes, welches übergeben wird, synchron zum
* Dispath-Thread ausgeführt wird. Ausserdem kehrt die Methode
* erst dann zurück, wenn eben dieser Code ausgeführt wurde.
*/
try {
SwingUtilities.invokeAndWait( new Runnable(){
public void run(){
JOptionPane.showMessageDialog( Exportieren.this,
"Algorithmus erfolgreich beendet.", "Beendet",
JOptionPane.INFORMATION_MESSAGE );
}
});
} catch (InterruptedException e) {
// Kann ja sein, das hier was schiefgeht...
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
// Programm beenden, nachdem der Dialog geschlossen wurde
System.exit(0);
}
}
}