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