GUI.java:import java.awt.*;import java.awt.event.*;import java.awt.geom.*;import javax.swing.*;public class GUI extends JComponent implements ActionListener { /** * @param args */ private JFrame f; private Graphics g; //private int height, width; private int startheight = 700; // Höhe des Fensters beim Programmstart private int startwidth = 700; // Breite des Fensters beim Programmstart private double xFaktor; //Streckungsfaktor in x-Richtung private double yFaktor; //Streckungsfaktor in y-Richtung private int zoom=60; //gibt den Vergrößerungsfaktor der gesamten Grafik an (Bisher außer länge Scalenstriche) private int zeichenqualitaet=12; private Color gitterfarbe = Color.lightGray; //Gitterfarbe beim Start private Color koordinatenkreuzfarbe = Color.black; //Farbe des Koordinatenkreuzes beim Start private Color graphenfarbe = Color.black; //Farbe des Graphen beim Start private Color hintergrundfarbe = Color.white; //Hintergrundfarbe, wird aber überschrieben public static void main(String[] args) { JFrame f = new JFrame(); f.setTitle("Matheprog"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//damit Prog beendet wird Container contentPane = f.getContentPane(); f.getContentPane().setLayout(new BorderLayout()); // Layout setzen GUI gui = new GUI(f); f.add(gui, BorderLayout.CENTER); // Bildschirmabmessungen holen Toolkit kit = Toolkit.getDefaultToolkit(); Dimension d = kit.getScreenSize();//Fenster wird mittig plaziert f.setLocation(d.width / 2 - f.getWidth() / 2, (d.height / 2 - f .getHeight() / 2)); // Texteingabe unten JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); //BoxLayout sorgt hier dafür, dass der Platz in x-Richtung ganz ausgefüllt wird JButton button = new JButton("OK"); JTextField textField = new JTextField(); panel.add(textField); panel.add(button); f.add(panel, BorderLayout.SOUTH); // Symbol des Fensters festlegen Image img = kit.getImage("icon2.gif"); f.setIconImage(img); f.setVisible(true); panel.setVisible(true); } public GUI(JFrame f) { f.setSize(startheight, startwidth); menuezeileErzeugen(f); addComponentListener( // Zeichnet Fenster neu bei Resize new ComponentAdapter() { public void componentResized(ComponentEvent e) { System.out.println("Repaint"); repaint(); } }); } @Override protected void paintComponent(Graphics g) { int paintheight = this.getHeight(); int paintwidth = this.getWidth(); //g.clearRect(0, 0, paintwidth, paintheight); Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); this.isMaximumSizeSet(); System.out.println("Breite des Malfensters : " + paintwidth); System.out.println("Höhe des Malfensters : " + paintheight); xFaktor = Math.ceil (((double) paintwidth / (double) (startwidth)));//Berechnung des x-Faktors mit Rundung auf die 10er Stelle yFaktor = Math.ceil(((double) paintheight / (double) startheight));//Berechnung des y-Faktors mit Rundung auf die 10er Stelle System.out.println("Neuer x-Faktor: " + xFaktor); System.out.println("Neuer y-Faktor: " + yFaktor); koorinatenkreuz(g2,paintheight,paintwidth); graphzeichnen(g2,paintheight,paintwidth); } public void koorinatenkreuz(Graphics2D g2,int height, int width) //Zeichnet bisher das Koordinatenkreuz mit Scala und Raster { int i=0; g2.setColor(gitterfarbe); while ((i < width/2)&&(i<height/2)) { //Zeichnet Gitter g2.draw( new Line2D.Double((width/2)-(i*(0.5*zoom * yFaktor)),0,(width/2)-(i*(0.5*zoom * yFaktor)),height));// Linien in y-Richtung - g2.draw( new Line2D.Double((width/2)+(i*(0.5*zoom * yFaktor)),0,(width/2)+(i*(0.5*zoom * yFaktor)),height));// Linien in y-Richtung + g2.draw( new Line2D.Double(0,(height/2)-(i*(0.5*zoom * xFaktor)),width,(height/2)-(i*(0.5*zoom * xFaktor))));//Linien in x-Richtung - g2.draw( new Line2D.Double(0,(height/2)+(i*(0.5*zoom * xFaktor)),width,(height/2)+(i*(0.5*zoom * xFaktor))));//Linien in x-Richtung + i = i +1; } g2.setColor(koordinatenkreuzfarbe); //setzt die Farbe des Koordinatenkreuzen einschließlich Scala g2.draw( new Line2D.Double(0, height / 2, width, height / 2)); // vertikale Linie zeichnen g2.draw( new Line2D.Double(width / 2, 0, width / 2, height)); // horizontale Linie zeichnen i = 0; while ((i < width/2)&&(i<height/2)) { //Zeichnet Scala auf die Achsen g2.draw( new Line2D.Double((width/2)+(i*(1*zoom * xFaktor)), (height / 2 + (4 * yFaktor)), (width/2)+(i*(1*zoom * xFaktor)),(height / 2 - (4 * yFaktor))));// Scala der x-Achse g2.draw( new Line2D.Double((width/2)-(i*(1*zoom * xFaktor)), (height / 2 + (4 * yFaktor)), (width/2)-(i*(1*zoom * xFaktor)),(height / 2 - (4 * yFaktor))));// g2.draw( new Line2D.Double((width / 2 + (4 * xFaktor)),(height/2)+(i*(1*zoom * yFaktor)),(width / 2 - (4 * xFaktor)),(height/2)+(i*(1*zoom * yFaktor)))); //Scala der y-Achse g2.draw( new Line2D.Double((width / 2 + (4 * xFaktor)),(height/2)-(i*(1*zoom * yFaktor)),(width / 2 - (4 * xFaktor)),(height/2)-(i*(1*zoom * yFaktor))));// i = i+1; } //Zeichnet Zahlen an die Skala g2.drawString("0",(int)((width/2)+1*xFaktor),(int) (height / 2 + (15 * xFaktor))); i = 1; while ((i < width/2)&&(i<height/2)) { //Zeichnet Scala auf die Achsen g2.drawString(""+(i),(int)((width/2)+(1+i*(1*zoom * xFaktor))),(int) (height / 2 + (15 * xFaktor))); //Zahlen in x + Richtung g2.drawString(""+(-i),(int)((width/2)-(1+i*(1*zoom * xFaktor))),(int) (height / 2 + (15 * xFaktor)));//Zahlen in x - Richtung g2.drawString(""+(-i),(int) (width / 2 + (5 * xFaktor)),(int)((height/2)+(1+i*(1*zoom * xFaktor))));//Zahlen in y - Richtung g2.drawString(""+(i),(int) (width / 2 + (5 * xFaktor)),(int)((height/2)-(1+i*(1*zoom * xFaktor))));//Zahlen in y + Richtung i = i + 1; } } private void menuezeileErzeugen(JFrame fenster) { final int SHORTCUT_MASK = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); JMenuBar menuezeile = new JMenuBar(); fenster.setJMenuBar(menuezeile); JMenu dateiMenue = new JMenu("Datei"); menuezeile.add(dateiMenue); JMenuItem beendenEintrag = new JMenuItem("Beenden"); dateiMenue.add(beendenEintrag); beendenEintrag.addActionListener(this); JMenu einstellungenMenue = new JMenu("Einstellungen"); menuezeile.add(einstellungenMenue); JMenuItem einstellungenEintrag = new JMenuItem("Farbeeinstellungen"); einstellungenMenue.add(einstellungenEintrag); einstellungenEintrag.addActionListener(this); JMenuItem zoominEintrag = new JMenuItem("Zoom + "); zoominEintrag.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, SHORTCUT_MASK)); einstellungenMenue.add(zoominEintrag); zoominEintrag.addActionListener(this); JMenuItem zoomoutEintrag = new JMenuItem("Zoom - "); zoomoutEintrag.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, SHORTCUT_MASK)); einstellungenMenue.add(zoomoutEintrag); zoomoutEintrag.addActionListener(this); JMenu hilfeMenue = new JMenu("Hilfe"); menuezeile.add(hilfeMenue); JMenuItem infoEintrag = new JMenuItem("Info"); hilfeMenue.add(infoEintrag); infoEintrag.addActionListener(this); } public void actionPerformed(ActionEvent event) { System.out.println("Eintrag:" + event.getActionCommand()); if (event.getActionCommand() == "Beenden") beenden(); if (event.getActionCommand() == "Info") zeigeInfo(); if (event.getActionCommand() == "Farbeeinstellungen") einstellungenoeffnen(); if (event.getActionCommand() == "Zoom + ") zoomin(); if (event.getActionCommand() == "Zoom - ") zoomout(); } private void einstellungenoeffnen() { JFrame win = new JFrame(); win.setTitle("Farbeeinstellungen"); Container contentPane = win.getContentPane(); win.getContentPane().setLayout(new GridLayout(3,2)); win.setSize(300, 150); JLabel koordinatenfarbentext = new JLabel("Koordinatenkreuzfarbe: "); JComboBox koordinatenfarben = new JComboBox(); koordinatenfarben.addItem("Schwarz"); koordinatenfarben.addItem("Magenta"); koordinatenfarben.addItem("Rot"); koordinatenfarben.addItem("Blau"); koordinatenfarben.addItem("Orange"); koordinatenfarben.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { JComboBox selectedChoice = (JComboBox) e.getSource(); if (selectedChoice.getSelectedItem().equals("Schwarz")) koordinatenkreuzfarbe = Color.black; if (selectedChoice.getSelectedItem().equals("Magenta")) koordinatenkreuzfarbe = Color.MAGENTA; if (selectedChoice.getSelectedItem().equals("Rot")) koordinatenkreuzfarbe = Color.red; if (selectedChoice.getSelectedItem().equals("Blau")) koordinatenkreuzfarbe = Color.blue; if (selectedChoice.getSelectedItem().equals("Orange")) koordinatenkreuzfarbe = Color.orange; repaint(); } }); JLabel gitterfarbentext = new JLabel("Gitterfarbe: "); JComboBox gitterfarben = new JComboBox(); gitterfarben.addItem("Hellgrau"); gitterfarben.addItem("Grau"); gitterfarben.addItem("Weiß"); gitterfarben.addItem("Schwarz"); gitterfarben.addItem("Cyan"); gitterfarben.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { JComboBox selectedChoice = (JComboBox) e.getSource(); if (selectedChoice.getSelectedItem().equals("Schwarz")) gitterfarbe = Color.black; if (selectedChoice.getSelectedItem().equals("Cyan")) gitterfarbe = Color.cyan; if (selectedChoice.getSelectedItem().equals("Grau")) gitterfarbe = Color.gray; if (selectedChoice.getSelectedItem().equals("Hellgrau")) gitterfarbe = Color.lightGray; if (selectedChoice.getSelectedItem().equals("Weiß")) gitterfarbe = Color.white; repaint(); } }); JLabel graphenfarbentext = new JLabel("Graphenfarbe: "); JComboBox graphenfarben = new JComboBox(); graphenfarben.addItem("Schwarz"); graphenfarben.addItem("Rot"); graphenfarben.addItem("Grau"); graphenfarben.addItem("Weiß"); graphenfarben.addItem("Cyan"); graphenfarben.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { JComboBox selectedChoice = (JComboBox) e.getSource(); if (selectedChoice.getSelectedItem().equals("Schwarz")) graphenfarbe = Color.black; if (selectedChoice.getSelectedItem().equals("Cyan")) graphenfarbe = Color.cyan; if (selectedChoice.getSelectedItem().equals("Grau")) graphenfarbe = Color.gray; if (selectedChoice.getSelectedItem().equals("Rot")) graphenfarbe = Color.red; if (selectedChoice.getSelectedItem().equals("Weiß")) graphenfarbe = Color.white; repaint(); } }); win.add(koordinatenfarbentext); win.add(koordinatenfarben); win.add(gitterfarbentext); win.add(gitterfarben); win.add(graphenfarbentext); win.add(graphenfarben); win.setVisible(true); } private void zoomin(){ zoom = zoom+10; if (zoom>=500)zoom=500; repaint(); } private void zoomout(){ zoom = zoom-10; if (zoom<=10*xFaktor)zoom=10; repaint(); } private void beenden() { System.exit(0); } private void zeigeInfo() { JFrame win = new JFrame(); win.setTitle("Informationen"); Container contentPane = win.getContentPane(); win.getContentPane().setLayout(new BorderLayout()); win.setSize(300, 300); JLabel infotext = new JLabel( "Dies ist Philips und Christophers Matheprog"); win.add(infotext, BorderLayout.CENTER); win.setVisible(true); } private void graphzeichnen(Graphics2D g2, int paintheight, int paintwidth) { GeneralPath p = new GeneralPath(); //Pfad wird erstellt double x = 0-(paintwidth / 2); // Bildanfangskoordinate in Mathematische // x-Koordinate umformen //Zeichnung wird genauer und Zeichnen beschleunigen indem ungültige Werte abgefangen werden while((Double.isNaN(funktion(x)))){ //Überprüft ob der Wert eine Zahl ist //System.out.println(" X Wert: "+ x); x=x+0.01; } p.moveTo((paintwidth/2)+(x*(1*zoom * xFaktor)), (paintheight/2)-(funktion(x)*(1*zoom * yFaktor))); // Anfangspunkt des Pfades while (x <= paintwidth) { // Schleife zum Zeichnen des Graphen double y = funktion(x); // Berechnung des y-Werts der Funktion p.lineTo((paintwidth/2)+(x*(1*zoom * xFaktor)),(paintheight/2)-(y*(1*zoom * yFaktor))); // Nächster Punkt des Pfades // Umrechnung von math.Koordinate auf Pixelwert x = x + (1/(zeichenqualitaet*xFaktor)); // Zeichnen vom nachfolgenden x-Wert // Die Zahl "zeichenqualitaet" ist die Abstufung wie viele Punkte gezeichnet werden // durch diese Abstufung ergibt sich zB auch die Lücke bei 0 bei f(x)=sqrt(x) } g2.setColor(graphenfarbe); g2.draw(p); // Zeichen des Graphens } private double funktion(double x){ double y; y = x*x; // Funktion mit Variable x return y; }}Berechnungen.java:public class Berechnungen { public Berechnungen () { } public double funktion(double x){ double y; y = Math.sin(x); // Funktion mit Variable x return y; }}Zeichnen.java:import java.awt.Color;import java.awt.Graphics2D;import java.awt.geom.GeneralPath;public class Zeichnen { private int zeichenqualitaet=12; private Color graphenfarbe = Color.black; //Farbe des Graphen beim Start public Zeichnen(){ } public void graphzeichnen(Graphics2D g2, int paintheight, int paintwidth,int zoom,double xFaktor,double yFaktor) { Berechnungen Berechnungen = new Berechnungen(); GeneralPath p = new GeneralPath(); //Pfad wird erstellt double x = 0-(paintwidth / 2); // Bildanfangskoordinate in Mathematische // x-Koordinate umformen //Zeichnung wird genauer und Zeichnen beschleunigen indem ungültige Werte abgefangen werden while((Double.isNaN(Berechnungen.funktion(x)))){ //Überprüft ob der Wert eine Zahl ist //System.out.println(" X Wert: "+ x); x=x+0.01; } p.moveTo((paintwidth/2)+(x*(1*zoom * xFaktor)), (paintheight/2)-(Berechnungen.funktion(x)*(1*zoom * yFaktor))); // Anfangspunkt des Pfades while (x <= paintwidth) { // Schleife zum Zeichnen des Graphen double y = Berechnungen.funktion(x); // Berechnung des y-Werts der Funktion p.lineTo((paintwidth/2)+(x*(1*zoom * xFaktor)),(paintheight/2)-(y*(1*zoom * yFaktor))); // Nächster Punkt des Pfades // Umrechnung von math.Koordinate auf Pixelwert x = x + (1/(zeichenqualitaet*xFaktor)); // Zeichnen vom nachfolgenden x-Wert // Die Zahl "zeichenqualitaet" ist die Abstufung wie viele Punkte gezeichnet werden // durch diese Abstufung ergibt sich zB auch die Lücke bei 0 bei f(x)=sqrt(x) } g2.setColor(graphenfarbe); g2.draw(p); // Zeichen des Graphens } public Color getGraphenfarbe() { return graphenfarbe; } public void setGraphenfarbe(Color graphenfarbe) { this.graphenfarbe = graphenfarbe; } public int getZeichenqualitaet() { return zeichenqualitaet; } public void setZeichenqualitaet(int zeichenqualitaet) { this.zeichenqualitaet = zeichenqualitaet; }}