Denkanstoß für Umsetzung Eigenschaften Größe, Position

zer0

Erfahrenes Mitglied
Hallo :)

Ich bräuchte mal einen kleinen Denkanstoss bzw. Vorschläge.
Ich habe zwei Klassen, eine View, die das Fenster und alles beinhaltet und die Main-Klasse, die die View aufruft.
Meine View Klasse hat einen Button "Neu" der das ganze Fenster neustarten soll, aber die Position und Größe soll beibehalten werden. Dazu rufe ich die restart() Methode in der Main-Klasse auf. Der Methode übergebe ich die Position als Point und die Größe als Dimension.

So sieht meine Main Klasse aus:
Java:
import java.awt.Dimension;
import java.awt.Point;

import javax.swing.SwingUtilities;

public class Main {
	
	public static View classView; 
	
	public static void main(String[] args) {
		start(null, null);
	}
	
	public static void start(final Point p, final Dimension d) {
		Runnable run = new Runnable() {
			@Override
			public void run() {
				classView = new View();
				classView.setComponentLocation(p);
				classView.setComponentSize(d);
				classView.display();
			}	
		};
		SwingUtilities.invokeLater(run);
	}
	
        // diese Methode wird von meiner View Klasse aufgerufen
	public static void restart(Point p, Dimension d) {
		classView = null;
		start(p, d);
	}
}

Mein Problem ist nun, das ich anch einer eleganteren Lösung suche, wie ich diese Eigenschaften (Position, Größe) übergeben kann. Habe schon überlegt, vllt als Array oder eine Klasse "ViewProperties" zuerstellen, in dieser die Werte zu speichern und das Objekt dann an die restart() Methode aufzurufen.

Wollte mal eure Meinung hören und wie ihr sowas lösen würdet? :)

Schönen Abend noch!
 
Hallo,

also ich finde den Ansatz absolut ok. Ich finde es nicht unschön oder so.
Wenn du es aber umbedingt ändern willst würde ich es über eine eigene Klasse "ViewProperties"
machen, die die Dimension und den Punkt verwaltet. Ist nur die Frage woher die neuen
"Properties" kommen(wer oder was ruft restart auf?). Wenn du extra erst ein Objekt anlegen mußt, um es dann der View
zu übergeben anstatt es direkt zu machen halte ich das für wenig sinnvoll.

Gruß und schönes WE
 
Ich habe es jetzt mal mit einer eigenen Klasse ViewProperties gemacht. Die restart() Methode wird von der View Klasse aufgerufen. Vorher lass ich nun ein Objekt von ViewProperties erstellen der ich die View-Klasse selbst übergebe. Es liest die Position und Größe aus und danach übergebe ich die Properties an die Main Klasse.

Hier nun meine beiden Klassen.

ViewProperties:
Java:
public class ViewProperties {
	
	public Point position = null;
	
	public Dimension size = null;
	
	public ViewProperties(Object object) {
		if(object instanceof Component) {
			Point p = ((Component) object).getLocation();
			this.setPosition(p);
			Dimension d = ((Component) object).getSize();
			this.setSize(d);
		}
	}
	
	public void setPosition(Point position) {
		this.position = position;
	}
	
	public void setSize(Dimension size) {
		this.size = size;
	}

	public Point getPosition() {
		return position;
	}

	public Dimension getSize() {
		return size;
	}
	
}

Main:
Java:
public class Main {
	
	public static View classView; 
	
	public static Point position;
	
	public static Dimension size;
	
	public static void main(String[] args) {
		start();
	}
	
	public static void start() {
		Runnable run = new Runnable() {
			@Override
			public void run() {
				classView = new View();
				classView.setComponentLocation(position);
				classView.setComponentSize(size);
				classView.display();
			}	
		};
		SwingUtilities.invokeLater(run);
	}
	
	public static void restart(ViewProperties properties) {
		classView = null;
		position = properties.getPosition();
		size = properties.getSize();
		start();
	}
}

Hier noch ein Ausschnit aus meiner View Klasse, wo die restart Methode aufgerufen wird:
Java:
                if(e.getSource() == buttonNew) {
			//Point p = this.getLocationOnScreen();
			//Point p = this.getLocation();
			//Dimension d = this.getSize();
			ViewProperties properties = new ViewProperties(this);
			this.dispose();
			Main.restart(properties);
		}

Was meint ihr dazu? Vllt noch Verbesserungsvorschläge?

Schönes Wochenende :)
 
Hallo,

ich habe eine Frage und auf jeden Fall eine Anmerkung :)

Die Frage ist, woher dann die Klasse View die Werte bekommt. Wenn die z.B. in der GUI
eingegeben werden finde ich es überflüssig eine Klasse ViewProperties anzulegen,
wenn das Objekt der Klasse keinen Sinn hat, außer die Werte zusammen zu fassen.

Anmerkung:

Java:
buttonNew.addActionListener(new ActionListener () {

    public void actionPerformed (ActionEvent event) {
         ViewProperties properties = new ViewProperties(this);
         this.dispose();
         Main.restart(properties);
    }
});

... mag ich persönlich lieber, wenn alles Button ihren eigenen ActionListener bekommen.
Ich finde es wesentlich übersichtlicher. Ist aber nur eine Anmerkung :)
 
Hallo,

ich habe eine Frage und auf jeden Fall eine Anmerkung :)

Die Frage ist, woher dann die Klasse View die Werte bekommt. Wenn die z.B. in der GUI
eingegeben werden finde ich es überflüssig eine Klasse ViewProperties anzulegen,
wenn das Objekt der Klasse keinen Sinn hat, außer die Werte zusammen zu fassen.

Die Werte, Größe und Position (falls du diese meinst) werden vom User bestimmt. Natürlich hast du recht, nur für 2 Werte eine neue Klasse anlegen scheint überflüssig, bloß mein Gedanke war, wenn ich irgendwann mal mehr Eigenschaften habe, das es dann Unsauber wird wenn ich 5 Paramater an restart() übergebe!


Anmerkung:

Java:
buttonNew.addActionListener(new ActionListener () {

    public void actionPerformed (ActionEvent event) {
         ViewProperties properties = new ViewProperties(this);
         this.dispose();
         Main.restart(properties);
    }
});

... mag ich persönlich lieber, wenn alles Button ihren eigenen ActionListener bekommen.
Ich finde es wesentlich übersichtlicher. Ist aber nur eine Anmerkung :)

Ich bin genau der selben Meinung, habe auch vor die ActionListener in separate Klassen zu packen, sodass einfach die Logik vom Design getrennt ist!
 

Neue Beiträge

Zurück