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; } }