[QUIZ#9]HonniCilest(Java)

HonniCilest

Erfahrenes Mitglied
[Iterationmöglich, aber nur Ersetzung von F]
Total unperformant bei größeren Eingaben, aber die Funktionalität, wie ich bisher gekommen bin erfüllts :D (glaube ich zumindest :p)
Halbes Jahr Java, noch blutiger Anfänger, also seid nicht so hart ^.^

Ich denke der wichtigste funktionelle Teil steht in der überschriebenen paintComponent-Methode und in getWayToGo()

Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class ZeichenbegabteSchildkroete extends JFrame implements WindowListener, ActionListener {

	public static final long serialVersionUID = 1L;
	
	private JMenuBar myMenuBar;
	private JMenu schildkroete, farbgebung;
	private JCheckBoxMenuItem schwarz, rotverlauf;
	private JMenuItem myStart, myReset;
	
	private JPanel myPicture, myOptions, myActions;
	private JTextField startliste, iteration, ersetzungsliste;
	private JLabel _startliste, _iteration, _ersetzungsliste;
	private JTextField xPosition, yPosition, schrittweite, drehwinkel;
	private JLabel _xPosition, _yPosition, _schrittweite, _drehwinkel;
	
	private String myWayToGo;
	private int farbmodi;
	
	public ZeichenbegabteSchildkroete() {
		super();
		init();
		initFrame();
		initComponents();
		setVisible(true);
	}
	
	public void init() {
		farbmodi = 1;
	}
	
	public void initFrame() {
		setTitle("Zeichenbegabte Schildkroete");
		setSize(800,700);
		setLocation(50,50);
		addWindowListener(this);
	}
	
	public void initComponents() {
		// Menu für die verschiedenen Aufgaben
		myMenuBar = new JMenuBar();
			schildkroete = new JMenu("Schildkroete");
				myStart = new JMenuItem("Start");
				myStart.addActionListener(this);
				schildkroete.add(myStart);
				
				myReset = new JMenuItem("Reset");
				myReset.addActionListener(this);
				schildkroete.add(myReset);
			myMenuBar.add(schildkroete);
			
			farbgebung = new JMenu("Farbe");
				schwarz = new JCheckBoxMenuItem("schwarz");
				schwarz.setSelected(true);
				schwarz.addActionListener(this);
				farbgebung.add(schwarz);
				
				rotverlauf = new JCheckBoxMenuItem("roter Verlauf");
				rotverlauf.addActionListener(this);
				farbgebung.add(rotverlauf);
			myMenuBar.add(farbgebung);
		setJMenuBar(myMenuBar);
		// -----------------------------------
		
		// content
		setLayout(new BorderLayout());
		
		myOptions = new JPanel();
			myOptions.setLayout(new GridLayout(1,8));
		
			_xPosition = new JLabel("X-Position");
			_xPosition.setHorizontalAlignment(JLabel.CENTER);
			myOptions.add(_xPosition);
			
			xPosition = new JTextField("130");
			myOptions.add(xPosition);
			
			_yPosition = new JLabel("Y-Position");
			_yPosition.setHorizontalAlignment(JLabel.CENTER);
			myOptions.add(_yPosition);
			
			yPosition = new JTextField("10");
			myOptions.add(yPosition);
			
			_schrittweite = new JLabel("Schrittweite");
			_schrittweite.setHorizontalAlignment(JLabel.CENTER);
			myOptions.add(_schrittweite);
			
			schrittweite = new JTextField("5");
			myOptions.add(schrittweite);
			
			_drehwinkel = new JLabel("Drehwinkel");
			_drehwinkel.setHorizontalAlignment(JLabel.CENTER);
			myOptions.add(_drehwinkel);
			
			drehwinkel = new JTextField("22.5");
			myOptions.add(drehwinkel);
		add(myOptions, BorderLayout.NORTH);
		
		myPicture = new JPanel() {
			public static final long serialVersionUID = 1L;
			
			{ setOpaque(true); }
			
			public void paintComponent(Graphics g) {
				g.setColor(Color.white);
				g.fillRect(0, 0, getWidth(), getHeight());
				
				int gehe;
				double actualX, actualY;
				double drehe, actualDrehe;
				
				Vector tempX = new Vector();
				Vector tempY = new Vector();
				Vector tempW = new Vector();
				
				if(myWayToGo != null) {
					try {
						actualX = Integer.parseInt(xPosition.getText());
					}
					catch(NumberFormatException nfe) {
						xPosition.setText("0");
						actualX = 0;
					}
					try {
						actualY = Integer.parseInt(yPosition.getText());
					}
					catch(NumberFormatException nfe) {
						yPosition.setText("0");
						actualY = 0;	
					}
					try {
						gehe= Integer.parseInt(schrittweite.getText());
					}
					catch(NumberFormatException nfe) {
						schrittweite.setText("0");
						gehe = 0;
					}
					try {
						drehe = Double.parseDouble(drehwinkel.getText());
					}
					catch(NumberFormatException nfe) {
						schrittweite.setText("drehwinkel");
						drehe = 0;
					}
					actualDrehe = 0;
					
					if(farbmodi == 1) {
						g.setColor(Color.black);
					}
					// geht Zeichen für Zeichen durch
					for(int i=0; i<myWayToGo.length(); i++) {
						// F gefunden, zeichne eine Linie, Trigonometrie notwendig
						if(myWayToGo.charAt(i) == 'F') {
							if(farbmodi == 2) {
								// setzt Farbe der Linie entsprechend dem der Höhe
								if(actualY<=getHeight() && actualY >=0) {
									g.setColor(new Color((int)(actualY/getHeight()*255),0,0));
								}
								else {
									g.setColor(new Color(0,0,0));
								}
							}	
							// zeichne Linie, erst hier Rundung (Pixel sind ganzzahlig) um Rundungsfehler einzuschränken
							g.drawLine((int)actualX,
									(int)(getHeight()-actualY),
									// cos&sin nehmen Radiand nicht Grad! -> Umrechnung von Grad zu Radiand notwendig
									(int)(actualX+=Math.cos(actualDrehe*2*Math.PI/360)*gehe),
									(int)(getHeight()-(actualY+=Math.sin(actualDrehe*2*Math.PI/360)*gehe)));
						}
						// + gefunden, drehe Kopf der Schildkröte gegen den Uhrzeiger
						else if(myWayToGo.charAt(i) == '+') {
							actualDrehe += drehe;
						}
						// - gefunden, drehe Kopf der Schilkröte in Uhrzeigersinn
						else if(myWayToGo.charAt(i) == '-') {
							actualDrehe -= drehe;
						}
						// [ gefunden, speichere Daten
						else if(myWayToGo.charAt(i) == '[') {
							tempX.add(""+actualX);
							tempY.add(""+actualY);
							tempW.add(""+actualDrehe);
						}
						// ] gefunden, lese Daten
						else if(myWayToGo.charAt(i) == ']') {
							actualX = Double.parseDouble((String)tempX.lastElement());
							tempX.removeElementAt(tempX.size()-1);
							actualY = Double.parseDouble((String)tempY.lastElement());
							tempY.removeElementAt(tempY.size()-1);
							actualDrehe = Double.parseDouble((String)tempW.lastElement());
							tempW.removeElementAt(tempW.size()-1);
						}
					}
				}
			}
		};
		add(myPicture, BorderLayout.CENTER);
		
		myActions = new JPanel();
			myActions.setLayout(new GridLayout(1,6));

			_startliste = new JLabel("Startliste");
			_startliste.setHorizontalAlignment(JLabel.CENTER);
			myActions.add(_startliste);
			
			startliste = new JTextField("++++F");
			myActions.add(startliste);

			_iteration = new JLabel("Iteration");
			_iteration.setHorizontalAlignment(JLabel.CENTER);
			myActions.add(_iteration);
			
			iteration = new JTextField("5");
			myActions.add(iteration);

			_ersetzungsliste = new JLabel("Ersetzungsliste");
			_ersetzungsliste.setHorizontalAlignment(JLabel.CENTER);
			myActions.add(_ersetzungsliste);
			
			ersetzungsliste = new JTextField("FF-[-F+F+F]+[+F-F-F]");
			myActions.add(ersetzungsliste);
		add(myActions, BorderLayout.SOUTH);
		// -----------------------------------
	}
	
	// iteriert und ersetzt
	public String getWayToGo() {
		String myString = startliste.getText();
		int iterator;
		try {
			iterator = Integer.parseInt(iteration.getText());
		}
		catch(NumberFormatException nfe) {
			iterator = 0;
		}
		for(int i=1; i<=iterator; i++) {
			myString = myString.replaceAll("F", ersetzungsliste.getText());
		}
		return myString;
	}
		
	// WindowListener
	public void windowClosing(WindowEvent we) {
		System.exit(0);
	}
	public void windowClosed(WindowEvent we) {}
	public void windowOpened(WindowEvent we) {}
	public void windowActivated(WindowEvent we) {}
	public void windowDeactivated(WindowEvent we) {}
	public void windowIconified(WindowEvent we) {}
	public void windowDeiconified(WindowEvent we) {}
	
	// ActionListener
	public void actionPerformed(ActionEvent ae) {
		if(ae.getSource() == myStart) {
			myWayToGo = getWayToGo();
			repaint();
		}
		else if(ae.getSource() == myReset) {
			myWayToGo = null;
			repaint();
		}
		else if(ae.getSource() == schwarz) {
			farbmodi = 1;
			rotverlauf.setSelected(false);
			repaint();
		}
		else if(ae.getSource() == rotverlauf) {
			farbmodi = 2;
			schwarz.setSelected(false);
			repaint();
		}
	}
	
	public static void main(String[] args) {
		new ZeichenbegabteSchildkroete();
	}
}

Edit: jar-File im Anhang
 

Anhänge

  • zbs.jar
    5,8 KB · Aufrufe: 27
Zuletzt bearbeitet:

OnlyFoo

Erfahrenes Mitglied
Es empfielt sich für tempX,Y,Z nen Stack zu nehmen, sieht dann, wenn ichs richtig im Kopf habe, etwa so aus.
Java:
Stack<double> tempX = new Stack<double>();
tempX.push( bla );
bla = tempX.pop();

Sonnst für ein halbes Jahr Java sehr schön! =)
 

HonniCilest

Erfahrenes Mitglied
Hey, sorry war im Urlaub,
danke für deine Antwort - mir war bewusst, dass das mit Vector nicht wirklich toll ist, nur wusste ich leider nicht wie ich es anders machen sollte, jetzt weiß ichs :D Danke! :)