ableitung übermalt die funktion

tanzverfuehrung

Bekanntes Mitglied
Also ich baue mir grad einen Funktionsplotter, der auch schon funktioniert, ich kann eine Funktion eingeben, sie wird mir gezeichenet wenn ich auf den "Funktion zeichne" button klicke, mir wird für die Funktion die Wertetabelle ausgegeben, wenn ich auf den button "Wertetabelle" klicke und habe jetzt einen "Ableitung"sbutton hinzugefügt, der mir meine erste Ableitung ausgibt und mir die Ableitung auch noch zeichnet! Das funktioniert soweit auch alles,
mein Problem ist jetzt nur, das jedes mal wenn eine Funktion zum zeichnen gesetzt wird, das ganze canvas nochmal gezeichnet wird.(redraw())Da die ableitungs funktion auch als funktion gezählt wird, wird sie zwar gezeichnet,die Grund Funktion wird aber sozusagen übermalt.Das will ich nicht!
Du grund funktion soll im Canvas drin bleiben und die ABleitung soll darauf gezeichnet werden, am besten in einer anderen Farbe. Das wäre toll.........:toll:
ich weiß das der fehler bei mir in der setFunction methode liegt, weil da jedes mal,wenn eine Funktion gesetzt wird, die redraw() funktion aufgerufen wird.!
Aber wie könnte ich das am besten realisieren????

und meine zweite FRage ist, wie ich das am besten realsiere,wenn ich ein "Lösch" Button haben möchte, der mir alles wieder löscht,also die Wertetabelle,die Ableitung und die Funktion.....;)
weil an die labels und so, komme ich ja nicht ran, das ich sagen könnte clear() oder sowas....!?

ich hoffe sehr, mir kann jemand helfen!Danke schon mal im Vorraus!
:rtfm:
mal bissel code!
Java:
package funktionen;

public class PlotterGUI {

	private Display display = new Display();
	private Shell shell = new Shell(display);
	Funktionssplitter funktionssplitter;

	private FunktionPlotter canvas;

	/**
	 * Erstellt ein Canvas für den Funktionsplotter
	 */

	public void guiErstellt() {
		shell.setText("Funktions Plotter");
		shell.setSize(900, 600);
		// Canvas erzeugen und auf shell setzten
		canvas = new FunktionPlotter(shell, SWT.BORDER);
		............

		canvas.addMouseListener(new MouseListener() {

		...................

			@Override
			public void mouseUp(MouseEvent e) {
				...........
			}

			@Override
			public void mouseDown(MouseEvent e) {
				...........
			}

			@Override
			public void mouseDoubleClick(MouseEvent e) {}
		});

		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
	}

	/**
	 * Erstellt alle text felder aud der Anwendungsoberfläche
	 * 
	 * @param shell
	 *            Anwendungsoberfläche
	 * @return
	 */
	public Shell textFields(Shell shell) {
		// TextLabel auf shell erstellen mit erklärung des programms
		..............

		// Textfeld erstellen für die zu eingegebene Funktion
		..........

		// Button "Funktion zeichnen" erstellen
		Button zeichnen = new Button(shell, PUSH);
		zeichnen.setText("Funktion zeichnen");
		zeichnen.setBounds(550, 180, 140, 25);

		// Button einem Listener hinzufügen um auf die Ereignisse zu reagieren
		zeichnen.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				MathEngine mathEngine = new MathEngine();
				String text = feld.getText();
				IFunction f = mathEngine.eval(text);
				canvas.setFunction(f);

			};
		});
		// Button "Wertetabelle ausgeben" erstellen
		.............
		});

		// Button "Ableitung" erstellen zum Ausgeben und zeichnen der Funktion
		Button ableitung = new Button(shell, PUSH);
		ableitung.setText("Ableitung");
		ableitung.setBounds(550, 260, 140, 25);
		ErsteAbleitung ableitungen = new ErsteAbleitung(feld.getText());
		funktionssplitter = new Funktionssplitter(feld.getText(), ableitungen);
		ableitung.addListener(SWT.OK, new Listener() {
			@Override
			public void handleEvent(Event event) {
				String ableitung = funktionssplitter.ableitung(feld.getText());
				printAbleitung(ableitung);
				
				MathEngine mathEngine = new MathEngine();
				IFunction f = mathEngine.eval(ableitung);
		
				canvas.setFunction(f);

			}
		});
		
		// Button "Löschen" löscht die ganze Funktion
	//	Button löschen = new Button(shell, PUSH);
	//	löschen.setText("Funktion löschen");
	//	löschen.setBounds(550, 450, 140, 25);
	
	//	löschen.addListener(SWT.OK, new Listener() {
	//		@Override
	//		public void handleEvent(Event event) {

	//		}
	//	});
		return shell;
	}

	protected void printAbleitung(String ableitung) {
		Label label = new Label(shell, SWT.LEFT_TO_RIGHT);
		label.setBounds(550, 290, 140, 40);
		label.setText("f'(x)=" +ableitung);
	}

	/**
	 * Gibt die Wertetabelle zurück für das ganze x Intervall[-9..9]
	 * 
	 * @param stringFunction
	 *            Funktion für die, die Wertetabelle berechnet werden soll
	 * @return
	 */
	public void printWertetabelle(String stringFunction) {
		..............
		label.setText(stringBuilder.toString());
	}

	public static void main(String[] args) {
		new PlotterGUI().guiErstellt();
	}
}

und die Funktionsplotter Klasse ist zum zeichnen da!

Java:
package funktionen;

public class FunktionPlotter extends Canvas {

	private IFunction function;
	int oberstesEnde;
	int unterstesEnde;
	int linkesEnde;
	int rechtesEnde;

	FunktionPlotter(Composite parent,
					int style) {
		super(parent, style);
		//Standard einteilung
		setLinkesEnde(-10);
		setRechtesEnde(10);
		setOberstesEnde(10);
		setUnterstesEnde(-10);

		addPaintListener(new PaintListener() {

			@Override
			public void paintControl(PaintEvent e) {

				drawScala(e.gc);
				drawFunction(e.gc);
			}
		});
	}

	/** Zeichnet das Koordinatenkreuz und die Scala des Koordinatenkreuzes */
	private void drawScala(GC gc) {
		.......
		}
		// Y-Koordinatenachse
	.......
			//zeichnet die y-Achse
			......
			//zeichnet die einteilung und beschriftung der y-achse
			.........
		}
	}

	/**
	 * Zeichnet die Funktion
	 * 
	 * @param gc
	 */
	public void drawFunction(GC gc) {
		if (function == null)
			return;
		KoordinatenUmrechnerX umrechnerX = new KoordinatenUmrechnerX(getSize().x, linkesEnde, rechtesEnde);
		KoordinatenUmrechnerY umrechnerY = new KoordinatenUmrechnerY(getSize().y, oberstesEnde, unterstesEnde);
		int py2 = 0;
		int px2 = 0;

		// im Koordinatensystem gibt es 500 Pixel
		for (double x = -100; x < 100; x += 0.04) {
			// berechnet für das x das y
			double y = function.f(x);
			// berechnet X-Pixel für die bestimmte Funktion
			int px1 = (int) umrechnerX.f(x);
			// berechnet Y-Pixel für die bestimmte Funktion
			int py1 = (int) umrechnerY.f(y);
			gc.drawLine(px1, py1, px2, py2);
			px2 = px1;
			py2 = py1;
		}
	}
	
	public int getLinkesEnde() {
		return linkesEnde;
	}

	public void setLinkesEnde(int linkesEnde) {
		this.linkesEnde = linkesEnde;

	}

	public int getRechtesEnde() {
		return rechtesEnde;
	}

	public void setRechtesEnde(int rechtesEnde) {
		this.rechtesEnde = rechtesEnde;

	}

	public int getOberstesEnde() {
		return oberstesEnde;
	}

	public void setOberstesEnde(int oberstesEnde) {
		this.oberstesEnde = oberstesEnde;

	}

	public int getUnterstesEnde() {
		return unterstesEnde;
	}

	public void setUnterstesEnde(int unterstesEnde) {
		this.unterstesEnde = unterstesEnde;

	}

	public IFunction getFunction() {
		return function;
	}

	public void setFunction(IFunction function) {
		this.function = function;
		redraw();
	}
}

EDIT: und das ganze natürlich in SWT
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Klingt als könnte die FunktionPlotter-Klasse statt der einzelnen Funktion eine
List<IFunction> functions = new ArrayList<IFunction>();
haben, und entsprechend add/remove-Methoden (statt der set/get).

Dann kann man beliebig viele Funktionen gleichzeitig zeichnen, und sie mit
functions.clear();
auch wieder alle löschen.
 

tanzverfuehrung

Bekanntes Mitglied
Klingt als könnte die FunktionPlotter-Klasse statt der einzelnen Funktion eine
List<IFunction> functions = new ArrayList<IFunction>();
haben, und entsprechend add/remove-Methoden (statt der set/get).

Dann kann man beliebig viele Funktionen gleichzeitig zeichnen, und sie mit
functions.clear();
auch wieder alle löschen.

genau sowas habe ich gebraucht!! es funktioniert jetzt soweit,das ich die ableitung und die funktion gleichzeitig zeichnen kann:toll:, mit dem "Lösch"-Button kann ich auch beide Funktionen löschen,auf dem canvas.!Aber das reicht mir noch nicht, ich will das die wertetabelle , die ableitung und die eingegebene Funktion im Textfeld gelöscht werde.
Aber wie komme ich an meine text felder, labels und so weiter am besten ran?:rtfm:

EDIT:
und wieso kann ich bei SWT nicht sagen!
Java:
gc.setColor(Color.BLUE);
?????????
wie setzte ich da die farbe?
so dann
Java:
event.gc.setBackground(display.getSystemColor(SWT.COLOR_CYAN));
oder?und background ist dann auch sozusagen der stift?!?!?!:autsch:
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Bin nicht so der SWT-Experte, aber sowas wie das, was in "printAbleitung" gemacht wird, ist wohl falsch: Dort wird ja bei jedem Aufruf ein neues Label erstellt! Stattdessen sollte das Label als Instanzvariable gespeichert und nur EINmal im Konstruktor erstellt werden. Dann kann man bei diesem Label auch nachträglich den Text ändern (z.B. auf den leeren String, "", um ihn zu "Löschen").

Farben sind (wie alle anderen Resourcen in SWT) Dinge, die man erstellen kann, und die irgendwann wieder mit "dispose" freigegeben werden müssen (!) (Tschüss, Garbage Collection! :autsch: ). Bei den Standardfarben braucht man das zum Glück nicht direkt: Man kann sich mit sowas wie
Color color = display.getSystemColor(SWT.COLOR_GREEN);
ein Farb-Objekt holen, das man dann dem Graphics-Context geben kann.

SWT Color Model
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Mathematische Ableitung bilden (Inkl. Kurvendiskussion) AWT, Swing, JavaFX & SWT 7
E Warum übermalt paint das ganze Fenster? AWT, Swing, JavaFX & SWT 15
L Scrollbar übermalt AWT, Swing, JavaFX & SWT 2
G Dialog "übermalt" Teile des Frames AWT, Swing, JavaFX & SWT 20
Juelin JavaFX Netbeans Aufruf Funktion aus Scenebuilder AWT, Swing, JavaFX & SWT 8
G JButton mit importFiles-Funktion auf JDrawPane AWT, Swing, JavaFX & SWT 5
L JavaFx Textformatierung mittels Datenbank und Funktion anpassen AWT, Swing, JavaFX & SWT 5
T Combobox mit Autocomplete-Funktion AWT, Swing, JavaFX & SWT 7
C Swing Aufruf der Funktion (die ein Dialog anzeigt) über Symbol anzeigen lassen AWT, Swing, JavaFX & SWT 4
L Button Funktion zuweisen in WindowBuilder AWT, Swing, JavaFX & SWT 22
A Button mit Speicher-Funktion AWT, Swing, JavaFX & SWT 8
F main-Funktion bei Swing AWT, Swing, JavaFX & SWT 4
kilopack15 Buttons ohne Funktion AWT, Swing, JavaFX & SWT 2
J Event Handling Frage zu der Funktion addActionListener AWT, Swing, JavaFX & SWT 2
D SWT Button mit F5-Funktion AWT, Swing, JavaFX & SWT 1
E ActionListener führt falsche Funktion aus AWT, Swing, JavaFX & SWT 6
C Swing JTextField Funktion zuweisen - Löschen von Buchstaben/Sonderzeichen AWT, Swing, JavaFX & SWT 6
K Funktion für das Bewegen des Balles AWT, Swing, JavaFX & SWT 5
A Trennung GUI und Funktion AWT, Swing, JavaFX & SWT 5
A Textfeld.append/.setText ohne Funktion AWT, Swing, JavaFX & SWT 2
F Swing JTextField in JList (Funktion beibehalten) AWT, Swing, JavaFX & SWT 2
U Disable-Funktion AWT, Swing, JavaFX & SWT 1
C Swing Durch Inhaltsänderung eines JTextfields eine Funktion aufrufen AWT, Swing, JavaFX & SWT 5
J Swing Nach SwingWorker Funktion aus der GUI Klasse aufrufen AWT, Swing, JavaFX & SWT 5
W Funktion aus einer Java Datei in eine andere einbauen AWT, Swing, JavaFX & SWT 25
W Funktion per Tastendruck aufrufen. AWT, Swing, JavaFX & SWT 10
N Swing Funktion repaint() updated nicht AWT, Swing, JavaFX & SWT 5
lumo SWT Image funktion auf ImageDaten AWT, Swing, JavaFX & SWT 9
R mathematische Funktion x^2 AWT, Swing, JavaFX & SWT 6
R mathemathische Funktion x^2 AWT, Swing, JavaFX & SWT 2
J Progressbar mit einfacher Funktion AWT, Swing, JavaFX & SWT 6
L Swing Funktion animieren AWT, Swing, JavaFX & SWT 10
O Variablen an anonyme Funktion AWT, Swing, JavaFX & SWT 10
D Funktion JList.getSelectedValues() gibt nicht alle values zurück AWT, Swing, JavaFX & SWT 2
G Swing Update-Funktion für Swing-Anwendung AWT, Swing, JavaFX & SWT 5
J Swing JDialog mit static-Funktion anzeigen -> Rückgabewert AWT, Swing, JavaFX & SWT 3
I JTextArea mit Copy Paste Funktion AWT, Swing, JavaFX & SWT 7
H Funktion ausführen wenn Button gedrückt wird. AWT, Swing, JavaFX & SWT 2
B Restart-Funktion für einen Updatemechanismus?????? AWT, Swing, JavaFX & SWT 4
G F6 Funktion AWT, Swing, JavaFX & SWT 2
S Swing Button mit Funktion abbilden AWT, Swing, JavaFX & SWT 3
P Funktion ist nicht MAC kompatibel, warum? AWT, Swing, JavaFX & SWT 12
S Funktion nur ausführen, wenn Maus über Componente ist AWT, Swing, JavaFX & SWT 2
A Sleep Funktion / Thread-Problem ! AWT, Swing, JavaFX & SWT 11
GilbertGrape bei "Enter" Funktion ausführen, egal wo der Fokus AWT, Swing, JavaFX & SWT 2
F Jframe Exit Funktion überladen AWT, Swing, JavaFX & SWT 3
G kreis malen -> welche funktion? AWT, Swing, JavaFX & SWT 3
D SWT: Funktion zum Auslesen der Schriftgröße AWT, Swing, JavaFX & SWT 2
D GroupLayout an un plötzlich is CardLayout Funktion tot? AWT, Swing, JavaFX & SWT 10
R Editor mit "Gehe zu"-Funktion AWT, Swing, JavaFX & SWT 4
W Unterdrückung von FrameIcon-Funktion im JInternalFrame AWT, Swing, JavaFX & SWT 5
G Funktion für PopUp Menü AWT, Swing, JavaFX & SWT 32
F ZOOM Funktion in JTextPane AWT, Swing, JavaFX & SWT 6
D paint-Funktion wird nicht ausgeführt AWT, Swing, JavaFX & SWT 6
A Drag and Drop Funktion mit JLabel AWT, Swing, JavaFX & SWT 5
E Beim Schließen des Fensters eigene Funktion aufrufen AWT, Swing, JavaFX & SWT 8
L JOP.showInputDialog: Abbrechen Button-Funktion beenden AWT, Swing, JavaFX & SWT 5
D setPreferredSize(), setMaximumSize() ohne Funktion? AWT, Swing, JavaFX & SWT 4
S JComboBox -> undo Funktion hinzufügen! AWT, Swing, JavaFX & SWT 2
Z Welche Funktion von JTextArea muß ich überschreiben? AWT, Swing, JavaFX & SWT 4
R TAB-Funktion in Fenster ändern - genauer: STRG+TAB AWT, Swing, JavaFX & SWT 5
P Rückgängig-Funktion im Malprogramm AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben