Frage zu Algorithmus

nchristoph

Erfahrenes Mitglied
Hallo zusammen,

ich beschäftige mich gerade mit Swing und hab ein bisschen herumprobiert.

Ich will einen "Stern" zeichnen, also einfach nur 3 Linien die sich überschneiden.

Aber irgendwie bin ich mit der Paint funktion nicht wirklich zufrieden.

Java:
  public void paint(Graphics g) {
     for (int i = 0; i <= 2; i++) {
       if (i == 0) {
         setX1(0);
         setY1(0);
         setX2(getWidth());
         setY2(getHeight());
       } else if (i == 1) {
         setX1(0);
         setY1(getHeight());
         setX2(getWidth());
         setY2(0);
       } else if (i == 2) {
         setX1(getWidth() / 2);
         setY1(0);
         setX2(getWidth() / 2);
         setY2(getHeight());
       }
       g.drawLine(getX1(), getY1(), getX2(), getY2());
     }
   }

Wie kann ich das schöner machen?

Mein Ziel ist, die Linien mit nur einem drawLine aufruf zu zeichnen. Geht das überhaupt Codetechnisch schöner??

Kann mir da wer helfen?
 
Hi

woher kommen diese set/get-Methoden?
Einfach lokale Variablen verwenden wäre einfacher und weniger problematisch.

Und warum darf es nur ein drawLine sein?
Je ein drawLine pro if-Teil verkürzt das Ganze auch deutlich.
 
Die Getter und Setter sind natürlich da.

Ich will versuchen, wie kurz man so eine Funktion kriegen kann, darum nur ein drawLine aufruf als Ziel.

Hier der ganze Code:

Java:
package lines;

import java.awt.Graphics;

import javax.swing.BoxLayout;
import javax.swing.JFrame;

public class Lines extends JFrame {
   /**
    *
    */

   int x1, x2, y1, y2;

   private static final long serialVersionUID = 1L;

   public Lines() {
     super();
     setDefaultCloseOperation(EXIT_ON_CLOSE);
     getContentPane().setLayout(
         new BoxLayout(getContentPane(), BoxLayout.X_AXIS));

   }

   public void paint(Graphics g) {
     for (int i = 0; i <= 2; i++) {
       if (i == 0) {
         setX1(0);
         setY1(0);
         setX2(getWidth());
         setY2(getHeight());
       } else if (i == 1) {
         setX1(0);
         setY1(getHeight());
         setX2(getWidth());
         setY2(0);
       } else if (i == 2) {
         setX1(getWidth() / 2);
         setY1(0);
         setX2(getWidth() / 2);
         setY2(getHeight());
       }
       g.drawLine(getX1(), getY1(), getX2(), getY2());
     }
   }

   public static void main(String[] args) {
     Lines pc = new Lines();
     pc.setSize(400, 400);
     pc.setVisible(true);
     pc.repaint();
   }

   public int getX1() {
     return x1;
   }

   public void setX1(int x1) {
     this.x1 = x1;
   }

   public int getX2() {
     return x2;
   }

   public void setX2(int x2) {
     this.x2 = x2;
   }

   public int getY1() {
     return y1;
   }

   public void setY1(int y1) {
     this.y1 = y1;
   }

   public int getY2() {
     return y2;
   }

   public void setY2(int y2) {
     this.y2 = y2;
   }

}

Ist mein Unterfangen überhaupt möglich?
 
Kommt drauf an, was das eigentlich werden soll.
Dass die Variablen auch außerhalb von paint verfügbar sind und sogar mit Gettern/Settern darauf zugegriffen werden kann kommt mir sehr seltsdam vor. Wozu? Wann und wie oft paint aufgerufen wird kann man nicht wirklich kontrollieren, jedes paint überschreibt die Variablenwerte gleich mehrmals (also macht es keinen Sinn, überhaupt irgendwelche Werte außer die von paint reinzusetten), und die Werte müssen zwischen den einzelnen paint-Aufrufen auch nciht erhalten bleiben (damit sind instanzweite Variablen eifnach unnötig)

Und eben für die Codekürze wären drei drawLines vermutlich besser.

Java:
package lines;

import java.awt.Graphics;
import javax.swing.BoxLayout;
import javax.swing.JFrame;

public class Lines extends JFrame {
	public Lines() {
		super();
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.X_AXIS));
	}

	public void paint(Graphics g) {
		int w = getWidth();
		int h = getHeight();
		g.drawLine(0, 0, w, h);
		g.drawLine(0, h, w, 0);
		g.drawLine(w/2, 0, w/2, h);
	}

	public static void main(String[] args) {
		Lines pc = new Lines();
		pc.setSize(400, 400);
		pc.setVisible(true);
		pc.repaint();
	}
}
PS 1: Einen JFrame zu serialisieren stell ich mir nicht so sinnvoll vor,
und eine serialVersionUID mit Wert 1 und ohne Einbindung von Serializable kann sowieso weg.

PS 2: Das main ist falsch (auch wenns bisher keine sichtbaren Probleme gegeben hat),
das Swing-bezogene Zeug muss im EDT passieren. Siehe invokeAndWait.
 
Ok Danke für die Hinweise.

Beim heimfahren ist mir die Lösung gekommen: Arrays

Java:
package lines;

import java.awt.Graphics;

import javax.swing.BoxLayout;
import javax.swing.JFrame;

public class Lines extends JFrame {
   /**
    *
    */
   private static final long serialVersionUID = 1L;

   public Lines() {
     super();
     setDefaultCloseOperation(EXIT_ON_CLOSE);
     getContentPane().setLayout(
         new BoxLayout(getContentPane(), BoxLayout.X_AXIS));
   }

   public void paint(Graphics g) {
     int[] x1 = { 0, 0, getWidth() / 2 };
     int[] y1 = { 0, getHeight(), 0 };
     int[] x2 = { getWidth(), getWidth(), getWidth() / 2 };
     int[] y2 = { getHeight(), 0, getHeight() };
     
     for (int i = 0; i <= 2; i++)
       g.drawLine(x1[i], y1[i], x2[i], y2[i]);

   }

   public static void main(String[] args) {
     Lines pc = new Lines();
     pc.setSize(400, 400);
     pc.setVisible(true);
   }

}

Das ganze ist für mich nur ne Algorithmus und Swing Übung.

Danke für die Hilfe.
 

Neue Beiträge

Zurück