Klassen:
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();
}
}
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++;
}
}
}
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);
}
}
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;
}
}