externen code ausführen

Java-Freak

Bekanntes Mitglied
Hallo
ich hab mal ne frage:
wie kann ich denn einen code, der von irgent einer quelle kommt an einer bestimmten stelle in meinem programm ausführen ?
ich poste mal meinen code:
Java:
import java.awt.*;
import javax.swing.*;
public class Eos extends JPanel  {
	public int X(int wert) {
		int erg = (getSize().width/2)+wert;
		return erg;
	}
	public int Y(int wert) {
		int erg = (getSize().height/2)-wert;
		return erg;
	}
	public void drawAxes(Graphics g){
		g.drawLine(0,getSize().height/2,getSize().width,getSize().height/2);
		g.drawLine(getSize().width/2,0,getSize().width/2,getSize().height);
    	System.out.println(this.getSize());
	}
	public void paint(Graphics g) {
    	super.paint(g);
    	this.setBackground(Color.white);
    	drawAxes(g);
    	g.drawLine(X(0),Y(0), X(20), Y(20));
//hier will ich den code ausführen
    }
	public static void main(String[] args) {
    JFrame frame = new JFrame("bal bla");
    frame.getContentPane().add(new Eos());
    frame.setSize(200,300);
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setVisible(true);
	}
}
dieser code macht bisher nur ein fenster mit x und y achse. der benutzer soll jetzt mit einem anden programm(nem einfachen editor ich poste etz mal nicht) java code schrieben den ich dan mithilfe dieses programmes ausführen möchte. im endefekt will ich also ein zeichenprogramm schreiben, das der benutzer mit java füttert, welches ausgeführt wird.
Danke im Voraus!!
 
Hallo

Also da brauchst du ja sicher mal einen Compiler um den geschriebenen Java-Code umzuwandeln.

Also verstehe ich das richtig: Du willst ein Zeichenprogramm schreiben, in welchem man durch Programmierung in Java zeichnen kann?

Du könntest ja auch eine Art Interpreter schreiben, mit einem Textfile zum Beispiel:
Kreis mir durchmesser und x-y koordinaten: k 2 0 0
Linie von x1y1 nach x2y2: l 1 1 5 5
...oder so ähnlich

mfg
 
ja, im endefekt schon. nur durch diese klasse will ich erreichen das man nicht immer das ganze ausenrum schreiben muss sondern z.b. nur nen befehl zum Linie zeichnen
das mim interpreter ist schon nicht schlecht aber ich will den code nicht abspeichern sondern während der laufzeit in das programm einfügen.
normalerweise hat man ja ein festes programm das kompiliert wird und dann ausgeführt
ich will jatzt aber das der benutzen z. b. eingibt g.drawLine(X(0),Y(0), X(20), Y(20));und das wird dan so wie es ist augeführt.
das programm wird also praktisch während der laufzeit verändert und da bin ich mir nicht sicher ob das geht.
an der markierten stelle steht dann z. b. führeAus(eingabeBenutzer); und wenn der benutzer z.b.
g.drawLine(X(0),Y(0), X(20), Y(20));
g.drawLine(X(0),Y(0), X(10), Y(10));
wird es ausgefürt als ob es dort im programm stände
ich hoffe ihr versteht was ich meine😉
danke auf jeden fall schon mal!!
 
das problem ist dann natürlich das wenn der benutzer anderen java code wie z.b. System.out.println("bla"); eingibt, das das dann auch ausgeführt wird...
da wäre der interpreter schon besser
auch wenn der benutzer einen fehler in seinen eingegebenen code macht, dass nicht gleich das ganze System abstürzt...
der interpreter wäre warscheinlich das sicherste aber ich muss halt jeden grafik befehl definieren...
 
so, hab etz mal nen interpreteransatz gemacht aber bin schon wieder auf die nase geflogen...
Codes:
Editor.java:
Java:
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.StringTokenizer;
import javax.swing.*;

public class Editor {
	public static String next(JTextArea jta){
		System.out.println(jta.getText());
		return jta.getText();
	}
	public static void main(String[] args) {
		JFrame frame = new JFrame("Eos - Java Edition");
	    //frame.getContentPane().add(new DrawingBoard());
	    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	    frame.setVisible(true);
	    frame.setLayout(new BorderLayout(1,0));
	    final JTextArea ta = new JTextArea();
	    JButton b = new JButton("Ausführen");
	    frame.add( b , BorderLayout.PAGE_END); 
	    frame.add(ta ); 
	    b.addMouseListener( new MouseAdapter() { 
		      public void mouseClicked( MouseEvent e ) { 
		    	  JFrame frame = new JFrame("Eos - Java Edition - Drawing Board");
		    	  DrawingBoard board = new DrawingBoard();
		    	  frame.getContentPane().add(board);
		    	  frame.setSize(400,300);
		    	  frame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
		    	  frame.setVisible(true);
		    	  //board.draw(next(ta),hier hab ich keine ahnung was ich etz amchn könnte );
		      } 
		    } );    
	    frame.pack();
	    frame.setSize(500,500);
	}
}
DrawingBoard.java:
Java:
import java.awt.*;
import java.util.Scanner;

import javax.swing.*;
public class DrawingBoard extends JPanel  {
	public int X(int wert) {
		int erg = (getSize().width/2)+wert;
		return erg;
	}
	public int Y(int wert) {
		int erg = (getSize().height/2)-wert;
		return erg;
	}
	public void drawAxes(Graphics g){
		g.drawLine(0,getSize().height/2,getSize().width,getSize().height/2);
		g.drawLine(getSize().width/2,0,getSize().width/2,getSize().height);
	}
	public void draw(String s, Graphics g) {
		Scanner sc = new Scanner(s);
		if (s.startsWith("drawLine(")){
			g.drawLine(sc.nextInt(), sc.nextInt(), sc.nextInt(), sc.nextInt());
		}
	}
	public void paint(Graphics g) {
    	super.paint(g);
    	this.setBackground(Color.white);
    	drawAxes(g);
    }
}
in zeile 33 vom editor weiß ich nicht was ich etz da fürn graphics object angeben soll.
vll kann sich ja mal jemand der sich mit Graphics auskennt den code anschauen und sagen ob mein ansatz nicht schon falsch ist...bin noch ziemlich der anfänger.
Danke!
 
in zeile 33 vom editor weiß ich nicht was ich etz da fürn graphics object angeben soll.
vll kann sich ja mal jemand der sich mit Graphics auskennt den code anschauen und sagen ob mein ansatz nicht schon falsch ist...bin noch ziemlich der anfänger.
Danke!

Wenn du in dein DrawinBoard Panel zeichnen willst, brauchst du natürlich dessen graphics-Objekt. Du musst es aber so Programmieren, dass in der Paint-Methode des DrawingBoards die ganze Zeichnung jeweils neu gezeichnet wird (kenne mich nicht allzugut aus, aber so habe ichs schon für kleinere Dinge gemacht). Somit ist sichergestellt, dass die Zeichnung neu gezeichnet wird wenn du das Fenster verschiebst oder die grösse änderst etc. Mach mal ein System.out in die paint Methode rein, dann siehst du wann die immer ausgeführt wird.
Ob das so einfach wird einen "externen" Code zu laden weiss ich nicht. Ich habe erst gerade mal in diesem Forum etwas über Plugins gelesen, ist evtl. ein ähnliches Problem, aber nicht gerade einfach. Evtl. dein Vorhaben als Anfänger ein wenig zu gross, aber sicher interessant 😉

Informiere dich mal darüber wie man externen Code (jar's) lädt. Der Vorschlag einen eigenen Interpreter zu programmieren wäre aber auch nicht soo kompliziert: Linie, Kreis, Rechteck, Text, Bild ... was gibt es sonst noch für Zeichnungsmethoden in Java? Sind ja nicht hunderte für welche du den Text parsen und korrekt an die Funktion übergeben musst.

mfg
 
ja, aber was sollte das sein, ich habs ja nie benannt...

edit: das problem ist das wenn ich was zeichnen will muss ich ja ein graphics object angeben, das aber nur in DrawingBoard existiert, das ich deshalb von von editor nicht aufrufen kann.
umgekehrt wenn ich die draw methode gleich in paint() einfüge fehlt mir der string , den ich erst in editor bekomme

ich habe auch erst was hier gelesen...
http://www.java-forum.org/codeschnipsel-u-projekte/61076-code-laufzeit-generieren.html
könnte das richtige sein, muss mal durchlesen und ausproblieren. evtl kann ich ja dann auch das drawing board vom neuen code aus aufrufen
 
Zuletzt bearbeitet:
ok, ich habs selber über ne hilfsmethode gelöst
wens interressiert:
Editor.java
Java:
import java.awt.BorderLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;

public class Editor {
	public int postition = 0;
	public static void main(String[] args) {
		JFrame frame = new JFrame("Eos - Java Edition 1.0");
	    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	    frame.setVisible(true);
	    frame.setLayout(new BorderLayout(1,0));
	    final JTextArea ta = new JTextArea();
	    JButton b = new JButton("Ausführen");
	    frame.add( b , BorderLayout.PAGE_END); 
	    frame.add(ta ); 
	    b.addMouseListener( new MouseAdapter() { 
		      public void mouseClicked( MouseEvent e ) { 
		    	  JFrame frame = new JFrame("Eos - Java Edition 1.0 - Drawing Board");
		    	  DrawingBoard board = new DrawingBoard();
		    	  frame.getContentPane().add(board);
		    	  frame.setSize(400,300);
		    	  frame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
		    	  frame.setVisible(true);
		    	  board.setS(ta.getText());
		    	  board.draw(board.getGraphics());
		      } 
		    } );    
	    frame.pack();
	    frame.setSize(500,500);
	}
}
DrawingBoard.java
Java:
import java.awt.*;
import java.util.Scanner;
import javax.swing.*;
@SuppressWarnings("serial")
public class DrawingBoard extends JPanel  {
	public int X(int wert) {
		int erg = (getSize().width/2)+wert;
		return erg;
	}
	public int Y(int wert) {
		int erg = (getSize().height/2)-wert;
		return erg;
	}
	static String s;
	public void drawAxes(Graphics g){
		g.drawLine(0,getSize().height/2,getSize().width,getSize().height/2);
		g.drawLine(getSize().width/2,0,getSize().width/2,getSize().height);
	}
	public void setS(String h){
		s=h;
	}
	public static boolean exeptionThrowed= true;
	static boolean exeption= false;
	public static void throwExeption(String t){
		if(!exeption){
			JFrame frame = new JFrame("Eos - Java Edition 1.0 - Fehlermeldung");
			frame.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
  	  		frame.setSize(500,200);
  	  		frame.setVisible(true);
  	  		JLabel h = new JLabel(t);
  	  		frame.add(h);
  	  		exeption = true;
		}
	}
	public void draw(Graphics g) {
		Scanner sc = new Scanner (s);
		int position = 0;
		while(sc.hasNextLine()){
		 	exeptionThrowed= true;
			position++;
			String r = sc.nextLine();
			Scanner sc2 = new Scanner (r);
		 	if (r.startsWith("linie")){
		 		sc2.skip("linie");
		 		g.drawLine(X(sc2.nextInt()),Y(sc2.nextInt()),X(sc2.nextInt()),Y(sc2.nextInt()));
		 		exeptionThrowed = false;
		 	}
		 	if (exeptionThrowed){throwExeption("Fehler in Zeile: "+position);}
		 	System.out.println("222");
		}
	}
	public void paint(Graphics g) {
    	super.paint(g);
    	this.setBackground(Color.white);
    	drawAxes(g);
    	draw(g);
    }
}
kann zwar bisher nur linien zeichnen und das auch nicht in java aber is im endefekt nur ne anpassungssache der draw methode
trotzdem danke für die antworten!!
 

Zurück
Oben