Anfänger bräuchte Hilfe - Eingabezeile !

Status
Nicht offen für weitere Antworten.
Hallo ihr Lieben,

bin heute auf euer Forum gestoßen und hab auch schon die Suchfunktion benutzt, jedoch kam ich leider zu keiner Lösung.

Und zwar folgendes Problem:
Ein Freund und ich müssen für unserer Abiturprüfung ein Java-Programm schreiben, was mathematische Funktionen zeichnet. Das zeichnen haben wir schon alles hinbekommen, nur müssen wir die Funktion z.Z. noch im Quellcode selbst eingeben.

Deshalb wollte ich nach ganz unten ein großes Texteingabefeld und ein Knopf machen, wo man eine Funktion hineinschreiben kann und dann mit Druck auf einen Knopf genau diese Funktion neu gepaintet wird.

Kann mir von euch vielleicht jemand helfen, wie ich unten diese Textzeile dort hinbekomme ?

Ich poste euch mal die GUI.java, wobei es glaub ich eh oben nur irgendwo in den Teil muss, wo auch das mit dem JFrame und so ist, oder ?

Code:
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 Color gitterfarbe = Color.lightGray; //Gitterfarbe beim Start

	private Color koordinatenkreuzfarbe = Color.black; //Farbe des Koordinatenkreuzes beim Start
	
	private Zeichnen Zeichnen = new Zeichnen();
		
	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);
		// 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));
		// Symbol des Fensters festlegen
		Image img = kit.getImage("icon2.gif");
		f.setIconImage(img);
		f.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);
		Zeichnen.graphzeichnen(g2,paintheight,paintwidth,zoom,xFaktor,yFaktor);
	}

	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"))
					Zeichnen.setGraphenfarbe(Color.black);
				if (selectedChoice.getSelectedItem().equals("Cyan"))
					Zeichnen.setGraphenfarbe(Color.cyan);
				if (selectedChoice.getSelectedItem().equals("Grau"))
					Zeichnen.setGraphenfarbe(Color.gray);
				if (selectedChoice.getSelectedItem().equals("Rot"))
					Zeichnen.setGraphenfarbe(Color.red);
				if (selectedChoice.getSelectedItem().equals("Weiß"))
					Zeichnen.setGraphenfarbe(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);

	}

}


Wäre euch bei Hilfe echt sehr sehr dankbar, wie gesagt, haben zwar noch 2 Wochen Zeit, aber soll ja schließlich eine (relativ) gute Note zum Ende rauskommen 🙂

Vielen Dank und mit lieben Grüßen
EE
 
Hi,

Deshalb wollte ich nach ganz unten ein großes Texteingabefeld und ein Knopf machen, wo man eine Funktion hineinschreiben kann und dann mit Druck auf einen Knopf genau diese Funktion neu gepaintet wird.


Code:
      Container contentPane = f.getContentPane(); 
      f.getContentPane().setLayout(new BorderLayout()); // Layout setzen 
      GUI gui = new GUI(f); 
      f.add(gui, BorderLayout.CENTER);
     
      JPanel panel = new JPanel();
      ...
      f.add(panel, BorderLayout.SOUTH);

auf das JPanel kommen dann JTextField und ein JButton, ActionListener an den Button und fertig :wink:


Gruß,
madboy
 
Ersteinmal vielen lieben Dank für die schnelle Hilfe 🙂

Also ich habe den Code jetzt eingesetzt und natürlich sehe ich keine Veränderung, da ich wahrscheinlich noch, wie du meintest, dass JTextField einbauen muss.

Trotz mehrerer versuche mit JTextField eingabe = new JTextField() und ähnlichen, seh ich leider immernoch keine Textzeile unten.

Wenn sich jemand die Umstände machen würde und mir erklären würde, wie ich dass nun da unten reinbekomme, darüber wäre ich echt sehr dankbar 🙂

Z.Z. sieht der entsprechende Code an der Stelle wieder so aus:

Code:
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(); 	     
	                f.add(panel, BorderLayout.SOUTH); 


		// Symbol des Fensters festlegen
		Image img = kit.getImage("icon2.gif");
		f.setIconImage(img);

		f.setVisible(true);

	}

Also nochmals vielen Dank !!

Mit freundlichen Grüßen
EE
 
Hi,

da ich wahrscheinlich noch, wie du meintest, dass JTextField einbauen muss.
genau:

Code:
      // Texteingabe unten 
      JPanel panel = new JPanel();          
      JTextField textField = new JTextField();
      panel.add(textField );
                   f.add(panel, BorderLayout.SOUTH);

Das Selbe noch für den JButton

Für JTextField und den notwendigen Listener für JButton siehe z.B.
http://www.galileocomputing.de/open...14_016.htm#mj89b08c6c510c4a0d48fae36c2d614aa8
Ihr sollt eure Hausaufgaben ja selber machen :wink:

Gruß,
madboy
 
Also erstmal vielen Dank madboy, dass du dich so mit meinen Problemen beschäftigst 🙂

Naja, so eine richtige Hausaufgabe ist es ja nicht, es ist für eine Abiprüfung und ich denke, da darf man auch mal auf Hilfe von anderen zurückgreifen ;-)

Aber ich muss dich wohl leider nocheinmal nerven, und zwar hab ich das jetzt so eingefügt, aber es ist noch immer kein Ansatz einer Textzeile zu erkennen.

Code:
Code:
// Texteingabe unten
JPanel panel = new JPanel(); 
JTextField textField = new JTextField(); 
panel.add(textField); 
f.add(panel, BorderLayout.SOUTH);

Aber glaube, wir haben es fast geschafft 🙂

Denke das mit den Button bekomm ich dann alleine hin, wenn ich einmal gesehen hab, wie man an irgendwelchen Stellen andere Elemente einfügt. Nur bis jetzt seh ich halt noch nichts ;-)

Also nochmals vielen lieben Dank.

Mit freundlichen Grüßen
EE
 
Hi,

Hörte sich irgendwie nach Hausaufgabe an :wink:

Das JTextField war vorher schon da, aber nicht sichtbar weil seine Größe gleich 0 war (man verbessere mich im Falle eines Irrtums)

so sollte es gehen:
Code:
      GUI gui = new GUI(f); 
      f.add(gui, BorderLayout.CENTER);

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

Schicke Sache übrigens! Wäre ich doch auch so motiviert gewesen fürs Mathe-Abi damals :roll:

Gruß,
madboy
 
Also erst einmal bin ich dir zu 1000 Dank verpflichtet ;-)

Hab das jetzt so probiert, jedoch seh ich unten immernoch keine Leiste, sieht also noch aus, wie auf dem oberen Foto.

Der Code sieht jetzt so aus:
Code:
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);

habe auch unten nochmal das panel.setVisible auf true gesetzt.. Aber immernoch nichts da 🙁

Aber hört sich doch alles schon so gut an .. verstehe nicht wieso das nicht angezeigt wird. Sinn macht es ja alles 🙂

Aber mal wieder vieeelen Dank für die Hilfe madboy .. Hast eigentlich was gut bei mir, mh ? 🙂

Liebe Grüße
EE
 
Sehr sehr seltsam. Habe gerade deinen Code kopiert, kompiliert und gestartet. Die TextArea und der Button waren sichtbar...

Kannst du mir den kompletten Code zukommen lassen (sofern es nicht extrem viel ist evtl. hier posten oder auf http://pastebin.ca/ einfügen und den Link posten)?

Aber mal wieder vieeelen Dank für die Hilfe madboy .. Hast eigentlich was gut bei mir, mh ?
Ich helfe gern (sofern ich kann :wink: ). Weiß, wie schwierig der Anfang sein kann...

Gruß,
madboy
 
Guuute Nachrichten 🙂

Und zwar musste ich alles nochmal in den Code schreiben, da mein Freund und ich das über SVN machen .. Und nach dem schließen des Programms (Eclipse 3.2) war leider alles weg.
Noch mal reingeschrieben das ganze.. und zack ..

Wir haben eine Leiste und einen Knopf !!

Genau so hab ich es mir vorgestellt ..

madboy .. ich bin dir zu tieeefsten Dank verpflichtet ;-)

Super, freut mich echt, dass das jetzt erstmal funktioniert hat..

Jetzt heißt es nur noch, unten den eingebenen Text wahrscheinlich von String in weiß noch nicht was umwandeln.. Damit man z.B. x * x eingeben kann, und das später dann mathematisch Benutzt werden kann, dass für x einfach ein int bzw eine Kommazahl eingesetzt werden kann ..

Ich habe den argen Verdacht, dass ich mich die nächsten Tage hier nochmal melden werde, hihi ..

Aber wie gesagt.. DAANKE soweit 🙂

Es Grüßt
EE
 
Das Parsen von Formeln ist nicht so trivial wie du zu meinen scheinst.
Schau mal in die FAQ, Beni hat sich die Arbeit gemacht und ein Beispiel für einen solchen Parser geschrieben.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben