Klassen:

ChartZeichnen

StartApplet

Scatterplot

GrafikFrame

Point


ChartZeichnen.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.util.*;
import java.lang.*;
import java.awt.Color;


// Klasse zum Zeichnen des Charts
// By.: KF & EG am 6-6-2004
//
public class ChartZeichnen extends JPanel{
// Konstruktor der Klasse
  public ChartZeichnen() {
  }

// Vereinbarung der Variablen
  private int iposX1, iposX2;
  private int iposY1, iposY2=1000;
  private int posSlider1, posSlider2;
  private int iCount = 0;
  private double dFaktorX, dFaktorY;
  private double[] dArrayWert;
  private double[] dArrayZeit = new double[8];
  private double dMaxY = 0;
  private double dSteigung = 0;
  private double dSteigungAbfrage = 0;
  private double dWertNeu = 0, dMittelWert = 0;
  private boolean drawArray = false, draw, draw1, bFirstTime, aFirstTime;
  Hashtable ht = new Hashtable();
  Hashtable htScaterPlott = new Hashtable();
  private String stringSelectedValue = "";

// Setzen der X-Position zum Zeichnen der Linien für den Slider1
  void posX1 (int xpos1) {
    iposX1 = xpos1;
    repaint();				// neu zeichen um Aenderung darzustellen
  }

// Setzen der X-Position zum Zeichnen der Linien für den Slider2
	void posX2 (int xpos2) {
    iposX2 = xpos2;
    repaint();				// neu zeichen um Aenderung darzustellen
  }

// Setzen der X-Position zum Zeichnen der Linien für den Min-Wert
	void posY1 (double ypos1) {
    iposY1 = (int)(ypos1*dFaktorY);    // Anpassen an Panel
    repaint();
  }

// Setzen der Y-Position zum Zeichnen der Linie für den Max-Wert 
  void posY2 (double ypos2) {
    iposY2 = (int)(ypos2*dFaktorY);  	// Anpassen an Panel
    repaint();
  }

// Zur fabigen Darstellung einer Linie
	void setSV (String st)  {
    stringSelectedValue = st;
    repaint();
  }

// Setzen des Maximums aller Werte
  void setMaxY (double max) {
    dMaxY = max;
  }

// Nicht in Verwendung
  void setSteigung (double steigung) {
    dSteigungAbfrage = steigung;
    repaint();
  }

// Methode zum setzen der Positionen der Slider
  public void posSliders (int posSlider_1, int posSlider_2) {
    posSlider1 = posSlider_1;
    posSlider2 = posSlider_2;
    repaint();
  }

// Methode für die Rückgabe einer Hashtable mit den Werten für den Scatterplot
  public Hashtable getHashtable() {
    return htScaterPlott;
  }

// Methode die Werte in die Klasse übernehmen
  public void drawArray(Hashtable htinput) {
    drawArray = true;
    ht = htinput;
    repaint();
  }

// Graphics zum zeichen 
  public void paint (Graphics g) {
    super.paint(g);
    int iStartX1, iStartY1, iStartX2, iStartY2;
    int iToken;
    double iWertNeu = 0;
    double dTimeInt1 = 0;
    double dTimeInt2 = 0;
    double dWertInt1 = 0;
    double dWertInt2 = 0;
    double dWertSlider2 = 0;
    double dTimeSlider2 = 0;
    htScaterPlott.clear();
    String stringHelp1, stringHelp2;
    iCount = 0;
    g.setColor(Color.CYAN);		// Setzen der Farbe für Wertebereichlinen
    g.drawLine(iposX1, 0, iposX1, 250);
    g.drawLine(iposX2, 0, iposX2, 250);
    g.drawLine(0, 240-iposY1, 400, 240-iposY1);
    g.drawLine(0, 240-iposY2, 400, 240-iposY2);
    g.setColor(Color.BLACK);		// Rücksetzen der Farbe auf schwarz
    Enumeration e1 = ht.keys();	// Schleife durch Hashtabe mit Werten
    while (e1.hasMoreElements()) {
      String Index = (String) e1.nextElement();
      if (Index.equals("Zeit")) {  // Wenn Zeit trage die Werte in ZeitArray
        stringHelp1 = (String) ht.get(Index);
        StringTokenizer st = new StringTokenizer(stringHelp1);
        iCount = 0;
        while (st.hasMoreTokens()) {
          stringHelp2 = st.nextToken();
          dArrayZeit[iCount] = Double.parseDouble(stringHelp2);
          iCount++;
        }
      }
      else {						// Daten in WerteArray speichern
        stringHelp1 = (String) ht.get(Index);
        StringTokenizer st = new StringTokenizer(stringHelp1);
        dArrayWert = new double[st.countTokens()];
        iToken = st.countTokens();
        iCount = 0;
        while (st.hasMoreTokens()) {
          stringHelp2 = st.nextToken();
          dArrayWert[iCount] = Double.parseDouble(stringHelp2);
          iCount++;
        }
        iCount = 0;
        //Berechnug der Faktoren zur Darstellung im Panel
        dFaktorY = 240 / dMaxY;	
        dFaktorX = 400 / 7;
        // Hier kommt die Abfrage ob die Line gezeichnet werden soll
        // in Abhängigkeit vom Wert
        draw = true;
        while (iCount < iToken) {
          if ((dArrayWert[iCount]*dFaktorY) > iposY2) {
            draw = false;
          }
          if ((dArrayWert[iCount]*dFaktorY) < iposY1) {
           draw = false;
          }
          iCount++;
        }
        // Setzen der Farbe wenn hervorheben
        if (stringSelectedValue.equals(Index)) {
          g.setColor(Color.RED);
        }
        else {
           g.setColor(Color.BLACK);
        }
        iCount = 0;
        int iCountMittel = 0;
        dMittelWert = 0.0;
        dWertNeu = 0.0;
        bFirstTime = false;
        aFirstTime = false;

        while ((iCount <  iToken-1) & (draw == true)) {
          //Zeichnen des Graphes
          iStartX1 = (int) (dArrayZeit[iCount] * dFaktorX);
          iStartX2 = (int) (dArrayZeit[iCount + 1] * dFaktorX);
          iStartY1 = (int) (240 - dArrayWert[iCount] * dFaktorY);
          iStartY2 = (int) (240 - dArrayWert[iCount + 1] * dFaktorY);
          g.drawLine(iStartX1, iStartY1, iStartX2, iStartY2);
          //
          // Hier erfolgt die ermittlung des Mittelwertes
          dTimeInt1 = dArrayZeit[iCount];
          dTimeInt2 = dArrayZeit[iCount + 1];
          dWertInt1 = dArrayWert[iCount];
          dWertInt2 = dArrayWert[iCount + 1];
          // Schauen wo der Slider2 steht und interpollieren wenn nötig
          if ((iStartX2 >= (posSlider2*4)) & (aFirstTime == false)) {
            dWertNeu = ( ( ((double)posSlider2/(100/(iToken-1))) - dTimeInt2) * dWertInt1 -
                        ( ((double)posSlider2/(100/(iToken-1))) - dTimeInt1) * dWertInt2) /
                (dTimeInt1 - dTimeInt2);
            dTimeSlider2 = ((double)posSlider2/(100/(iToken-1)));
            dWertSlider2 = dWertNeu;
            aFirstTime = true;
          }
          // Check ob Slider2 bewegt wurde und dadurch der Zeitbereich verkleinert wurde.
          // Wenn ja ist nun hier das neue Ende // Geht noch nicht
          if (((dTimeSlider2) < (iCount+1)) & (dTimeSlider2 != 0.0)) {

          }
			// Slider muss immer als Startpunkt fungieren 
          if ( (dArrayZeit[iCount + 1] * dFaktorX) >= posSlider1 * 4) {
            if (bFirstTime == false) {
              dWertNeu = ( ( ( (double) posSlider1 / (100 / (iToken - 1))) -
                  dTimeInt2) * dWertInt1 -
                  ( ( (double) posSlider1 / (100 / (iToken - 1))) -
                  dTimeInt1) * dWertInt2) /(dTimeInt1 - dTimeInt2);
              bFirstTime = true;
              iCountMittel++;
              dMittelWert = dMittelWert + dWertNeu;
            }
            else {
              dMittelWert = dMittelWert + dWertInt1;
              iCountMittel++;
            }
            // So nun der Letzte Wert: muss bei anderen Fileaufbau geändert werden
            if (iCount == 6) {
              dMittelWert = dMittelWert + dWertInt2;
              iCountMittel++;
            }
          }
          System.out.println("--------------------------");
          String out = "TS:" + dTimeSlider2 + "  WS:" + dWertSlider2 + "  MW:" + dMittelWert + "  CW:" + iCountMittel;
          System.out.println(out);

          iCount++;
        }
        // Befuellung der Hashtable für den ScaterPlott
        // Ermittle den Mittelwert
        if (draw == true) {
          dMittelWert = dMittelWert / iCountMittel;
          if (dWertNeu > 0) {
            dSteigung = dArrayWert[iCount] - dWertNeu;
          }
          else {
            dSteigung = dArrayWert[iCount] - dArrayWert[0];
          }
          // Eintrag der Werte in die HashTable
          Point pointScaterPlott = new Point(dMittelWert, dSteigung, g.getColor());
          htScaterPlott.put(Index, pointScaterPlott);
			// Ende erzeugung ------------------------------------------ */
          // repaint();
        }
      }
    }
  }
}

 StartApplet.java



import java.awt.*;
import javax.swing.UIManager;

public class StartApplet {
  boolean packFrame = false;

  // Die Anwendungen konstruieren
  public StartApplet() {
    Grafikframe frame = new Grafikframe();

    // Frames packen, die nutzbare bevorzugte Größeninformationen enthalten, z.B. aus Ihrem Layout
    //Frames überprüfen, die voreingestellte Größe haben
    if (packFrame)
      frame.pack();
    else
      frame.validate();

    // Frame zentrieren
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    Dimension frameSize = frame.getSize();
    if (frameSize.height > screenSize.height)
      frameSize.height = screenSize.height;
    if (frameSize.width > screenSize.width)
      frameSize.width = screenSize.width;
    frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);

    frame.setVisible(true);
  }

  // Main-Methode
  static public void main(String[] args) {
    try {
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }
    catch(Exception e) {
      e.printStackTrace();
    }
    new StartApplet();
  }
}

ScatterPlot.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.lang.*;
import java.util.*;


public class ScatterPlot extends JPanel {

  public ScatterPlot() {
  }

  private int ixPos1 = 0, ixPos2 = 0;
  private int iyPos1 = 0, iyPos2 = 0;
  private int iColor;
  private int iCount;
  private Color colorWahl;
  private Point pointHilfspunkt;
  private double dMaxMittel = 0, dMaxSteigung = 0, dMinSteigung = 0;
  private double dMaxY = 0;
  private double dFaktorX, dFaktorY;

  Hashtable ht = new Hashtable();

  public void drawPlott(Hashtable htinput) {
    ht = htinput;
    repaint();
  }

  void setMaxY (double max) {
    dMaxY = max;
  }

   public void paint(Graphics g) {
      super.paint(g);
		int iCount = 0;
      // Zeichne Koordinaten es reicht eine Teilung in der Mitte sonst 
      g.drawLine(0,250,500,250);
      // Faktoren zum Zeichnen
      dFaktorY = 500/dMaxY;
      dFaktorX = 500/(dMaxY);
      iCount = 0;
      Enumeration e2 = ht.keys();
      while (iCount < ht.size()) {
        String Index = (String) e2.nextElement();
        pointHilfspunkt = (Point) ht.get(Index);
        g.setColor(pointHilfspunkt.getColor());
        g.drawRect((int)((pointHilfspunkt.getX())*dFaktorX),(250 - ((int)(pointHilfspunkt.getY()*dFaktorY))),2,2);
        iCount++;
      }
   }
}

Grafikframe.java

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import java.util.*;

public class Grafikframe extends JFrame {
  JPanel contentPane;
  JMenuBar jMenuBar1 = new JMenuBar();
  JMenu jMenuFile = new JMenu();
  JMenuItem jMenuFileExit = new JMenuItem();
  JMenu jMenuHelp = new JMenu();
  JMenuItem jMenuHelpAbout = new JMenuItem();
  JSlider jSlider1 = new JSlider();
  ChartZeichnen jPanel1 = new ChartZeichnen();
  JSlider jSlider2 = new JSlider();
  ScatterPlot jPanel2 = new ScatterPlot();


  // Variablen
  private int iTest, iX, iY;
  private double dHelp =0, dHelpMin = 1000;
  private String stringFile;
  Hashtable h = new Hashtable();
 

  JTextField jTextField1 = new JTextField();
  JTextField jTextField2 = new JTextField();
  JScrollPane jScrollPane1 = new JScrollPane();
  JList jList1 = new JList();
  JButton jButton1 = new JButton();
  JTextField jTextField3 = new JTextField();
  JLabel jLabel1 = new JLabel();
  JLabel jLabel2 = new JLabel();
  JLabel jLabel4 = new JLabel();
  JLabel jLabel5 = new JLabel();
  JButton jButton2 = new JButton();
  JLabel jLabel6 = new JLabel();
  JLabel jLabel7 = new JLabel();

  // Frame konstruieren
  public Grafikframe() {
    enableEvents(AWTEvent.WINDOW_EVENT_MASK);
    try {
      jbInit();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }

  // Komponenten initialisieren
  private void jbInit() throws Exception {
    contentPane = (JPanel) this.getContentPane();
    this.setTitle("Kathrins und Ernsts Programm");
    this.setJMenuBar(jMenuBar1);
    this.setResizable(true);
    this.setSize(new Dimension(1000, 600));
    jMenuFile.setText("Datei");
    jMenuFileExit.setText("Beenden");
    jMenuFileExit.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        jMenuFileExit_actionPerformed(e);
      }
    });
    jSlider1.setInverted(false);
    jSlider1.setPaintTicks(true);
    jSlider1.setOpaque(true);
    jSlider1.setToolTipText("");
    jSlider1.setBounds(new Rectangle(20, 20, 412, 20));
    jSlider1.addChangeListener(new javax.swing.event.ChangeListener() {
      public void stateChanged(ChangeEvent e) {
        jSlider1_stateChanged(e);
      }
    });
    jSlider1.setValue(0);
    jPanel1.setBackground(Color.gray);
    jPanel1.setBounds(new Rectangle(25, 40, 405, 240));
    jSlider2.setOrientation(JSlider.HORIZONTAL);
    jSlider2.setPaintLabels(true);
    jSlider2.setPaintTicks(true);
    jSlider2.setAlignmentX((float) 0.5);
    jSlider2.setBorder(BorderFactory.createRaisedBevelBorder());
    jSlider2.setDoubleBuffered(false);
    jSlider2.setOpaque(true);
    jSlider2.setBounds(new Rectangle(25, 280, 405, 20));
    jSlider2.addChangeListener(new javax.swing.event.ChangeListener() {
      public void stateChanged(ChangeEvent e) {
        jSlider2_stateChanged(e);
      }
    });
    jSlider2.setValue(100);
    jPanel2.setBackground(Color.lightGray);
    jPanel2.setBounds(new Rectangle(450, 15, 500, 500));
    contentPane.setBackground(SystemColor.control);
    contentPane.setLayout(null);
    jTextField1.setText("0.0");
    jTextField1.setBounds(new Rectangle(128, 318, 148, 29));
    jTextField1.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        jTextField1_actionPerformed(e);
      }
    });
    jTextField2.setToolTipText("");
    jTextField2.setText("0.0");
    jTextField2.setBounds(new Rectangle(127, 358, 152, 31));
    jTextField2.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        jTextField2_actionPerformed(e);
      }
    });
    jScrollPane1.setBounds(new Rectangle(307, 318, 120, 200));
    jButton1.setBounds(new Rectangle(20, 465, 101, 22));
    jButton1.setText("File Laden");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        try {
          jButton1_actionPerformed(e);
        }
        catch (IOException ee) {
// FehlerAusgabe bei IO-Fehler
        }
      }
    });
    jTextField3.setText("jTextField3");
    jTextField3.setBounds(new Rectangle(18, 497, 253, 22));
    jTextField3.setText("C:/testdaten4.txt");
    jLabel1.setText("MIN-Wert");
    jLabel1.setBounds(new Rectangle(22, 313, 98, 32));
    jLabel2.setText("MAX-Wert");
    jLabel2.setBounds(new Rectangle(19, 357, 84, 33));
    jLabel4.setText("MIN");
    jLabel4.setBounds(new Rectangle(4, 19, 26, 17));
    jLabel5.setText("MAX");
    jLabel5.setBounds(new Rectangle(2, 283, 25, 20));
    jButton2.setBounds(new Rectangle(181, 463, 90, 23));
    jButton2.setText("Färben");
    jButton2.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        jButton2_actionPerformed(e);
      }
    });
    jLabel6.setText("(...)");
    jLabel6.setBounds(new Rectangle(78, 320, 46, 19));
    jLabel7.setText("(...)");
    jLabel7.setBounds(new Rectangle(77, 363, 47, 19));
    jMenuFile.add(jMenuFileExit);
    jMenuHelp.setText("Hilfe");
    jMenuHelpAbout.setText("Info");
    jMenuHelpAbout.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        jMenuHelpAbout_actionPerformed(e);
      }
    });
    jMenuHelp.add(jMenuHelpAbout);
    jMenuBar1.add(jMenuFile);
    jMenuBar1.add(jMenuHelp);
    contentPane.add(jPanel1, null);
    contentPane.add(jSlider2, null);
    contentPane.add(jSlider1, null);
    contentPane.add(jPanel2, null);
    contentPane.add(jScrollPane1, null);
    contentPane.add(jTextField1, null);
    contentPane.add(jTextField2, null);
    contentPane.add(jButton1, null);
    contentPane.add(jTextField3, null);
    contentPane.add(jLabel4, null);
    contentPane.add(jLabel5, null);
    contentPane.add(jButton2, null);
    contentPane.add(jLabel1, null);
    contentPane.add(jLabel6, null);
    contentPane.add(jLabel2, null);
    contentPane.add(jLabel7, null);
    jScrollPane1.getViewport().add(jList1, null);
  }

  //Überschreiben, sodass beim Beenden das Fenster geschlossen werden kann
  protected void processWindowEvent(WindowEvent e) {
    super.processWindowEvent(e);
    if (e.getID() == WindowEvent.WINDOW_CLOSING) {
      System.exit(0);
    }
  }

  //Aktion Datei | Beenden durchgeführt
  public void jMenuFileExit_actionPerformed(ActionEvent e) {
    System.exit(0);
  }

  //Aktion Hilfe | Info durchgeführt
  public void jMenuHelpAbout_actionPerformed(ActionEvent e) {
  }

  void jSlider1_stateChanged(ChangeEvent e) {
    if (jSlider1.getValue() < jSlider2.getValue()) {
      jPanel1.posX1(jSlider1.getValue() * 4);
      jPanel1.posSliders(jSlider1.getValue(), jSlider2.getValue());
      jPanel2.drawPlott(jPanel1.getHashtable());
    }
  }

  void jSlider2_stateChanged(ChangeEvent e) {
    if (jSlider2.getValue() > jSlider1.getValue()) {
      jPanel1.posX2(jSlider2.getValue() * 4);
      jPanel1.posSliders(jSlider1.getValue(), jSlider2.getValue());
      jPanel2.drawPlott(jPanel1.getHashtable());
    }
 }

  void jTextField1_actionPerformed(ActionEvent e) {
    if (Double.parseDouble(jTextField1.getText()) <= Double.parseDouble(jTextField2.getText())) {
      jPanel1.posY1(Double.parseDouble(jTextField1.getText()));
      jPanel2.drawPlott(jPanel1.getHashtable());
      Hashtable ht = jPanel1.getHashtable();
      Enumeration e1 = ht.keys();
      int iCount = 0; // Liste nur mit aktuellen Werten befüllen
      String[] data = new String[h.size()];
      while (e1.hasMoreElements()) {
      String Index = (String) e1.nextElement();
      data[iCount] = Index;
      iCount++;
      }
      jList1.setListData(data);
    }
  }

  void jTextField2_actionPerformed(ActionEvent e) {
    if (Double.parseDouble(jTextField2.getText()) >= Double.parseDouble(jTextField1.getText())) {
      jPanel1.posY2(Double.parseDouble(jTextField2.getText()));
      jPanel2.drawPlott(jPanel1.getHashtable());
      Hashtable ht = jPanel1.getHashtable();
      Enumeration e1 = ht.keys();
      int iCount = 0;
      String[] data = new String[h.size()];
      while (e1.hasMoreElements()) {
        String Index = (String) e1.nextElement();
        data[iCount] = Index;
        iCount++;
      }
      jList1.setListData(data);
    }
  }

  void jButton1_actionPerformed(ActionEvent e) throws IOException {
    stringFile = jTextField3.getText();
    //Schreibe File in Hashtable
    h.clear();
    BufferedReader br = new BufferedReader(new FileReader(jTextField3.getText()));
    String stringLine = "";
    String help,werte = "";
    int iCount = 0;
    while ((stringLine = br.readLine()) != null) {
      StringTokenizer st = new StringTokenizer(stringLine,";",false);
      help = st.nextToken();
      werte = st.nextToken();
      h.put(help,werte);
      // Finde den Max Wert
      if (help.equals("Zeit")) {}
      else {
        StringTokenizer stMax = new StringTokenizer(werte);
        while (stMax.hasMoreTokens()) {
          String stringHelp2 = stMax.nextToken();
          if (Double.parseDouble(stringHelp2) > dHelp) {
            dHelp = Double.parseDouble(stringHelp2);
          }
          if (Double.parseDouble(stringHelp2) < dHelpMin) {
            dHelpMin = Double.parseDouble(stringHelp2);
          }
        }
      }
      jLabel6.setText(Double.toString(dHelpMin));
      jTextField1.setText(Double.toString(dHelpMin));
      jLabel7.setText(Double.toString(dHelp));
      jTextField2.setText(Double.toString(dHelp));
    }
    jPanel1.setMaxY(dHelp);
    jPanel2.setMaxY(dHelp);
    Enumeration e1 = h.keys();
    iCount = 0;
    String[] data = new String[h.size()];
    while (e1.hasMoreElements()) {
       String Index = (String)e1.nextElement();
       if (Index.equals("Zeit")) {
       }
       else {
         data[iCount] = Index;
       }
       iCount++;
    }
    jList1.setListData(data);
    jPanel1.drawArray(h);
    jPanel2.drawPlott(jPanel1.getHashtable());
  }

// Methode zur Färbung einer Linie bzw. Punktes
  void jButton2_actionPerformed(ActionEvent e) {
    jPanel1.setSV(jList1.getSelectedValue().toString());
    jPanel2.drawPlott(jPanel1.getHashtable());
    Hashtable ht = jPanel1.getHashtable();
    Enumeration e1 = ht.keys();
    int iCount = 0;
    String[] data = new String[h.size()];
    while (e1.hasMoreElements()) {
       String Index = (String)e1.nextElement();
       data[iCount] = Index;
       iCount++;
    }
    jList1.setListData(data);
  }
}

Point.java

import java.awt.*;

public class Point {

    private double x;
    private double y;
    private Color myColor;

    public Point() {
        x = 0;
        y = 0;
        myColor = Color.black;
    }

    public Point(double x, double y, Color c) {
        this.x = x;
        this.y = y;
        myColor = c;
    }

    public void translate(double dx, double dy) {
        x = x + dx;
        y = y + dy;
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }

    public double getArea() {
        return 0;
    }

    public Color getColor() {
         return myColor;
    }
}