[Java] Welche Grafik-Bibliothek

Renegade

Well-known member
ID: 159167
L
3 August 2006
851
77
Hi,

Ich bin dabei Java zu lernen. Was mich jetzt interessiert ist, welche Grafik-Bibliotheken es gibt, und welche ihr mir empfehlen könnt.

Ein bisschen habe ich schon mit AWT gemacht, bis ich dann gelesen habe, dass die Bibliothek veraltet ist.
Haltet ihr Swing für geeignet? Oder gibt es da bessere Bibliotheken?
 
Als ich damals (~2004) viel mit Java und Grafik gearbeitet habe, war AWT auch schon nicht mehr der letzte Schrei. Letztendlich hab ich viel mit Eclipse als IDE gearbeitet, sodass die Wahl schnell auf SWT fiel.
 
ganz klar Swing oder SWT.
Performance ist bei beiden mitlerweile gleich (gibt noch die alten Infos, dass SWT um Meilen schneller ist).
Hinter beiden stecken eben verschiedene Programmierweisen und Zielgruppen, weshalb du da fpür dich selbst das bessere herausfinden musst.
Eine weitere Möglichkeit wäre vllt noch Qt für Java, aber das ist eher ein "stilles" Projekt, weshalb du dort nicht soviel Hilfe finden wirst, wie zu den beiden anderen.
 
Hi,

Danke an euch :)
Was ich bei SWT gut finde, ist das es sich an dem OS anpasst (native Methoden?). Allerdings hat Swing mich eher überzeugt, weil ich damit irgendwie besser klar komme.

Wo wir grad bei Grafikausgabe sind, gibt es in Java eigentlich sowas wie Templates, wie man es von PHP kennt (etwa eine Templateklasse wie Smarty)?
 
Danke an euch :)
Was ich bei SWT gut finde, ist das es sich an dem OS anpasst (native Methoden?). Allerdings hat Swing mich eher überzeugt, weil ich damit irgendwie besser klar komme.
Jep SWT nutzt native Methoden vom OS, Swing auch teilweise zeichnet aber vieles auch selbst. Ich finde Swing etwas komplexer als SWT, der Einsteig geht zwar schneller aber die Worker und so machen das dann etwas komplexer.

Wo wir grad bei Grafikausgabe sind, gibt es in Java eigentlich sowas wie Templates, wie man es von PHP kennt (etwa eine Templateklasse wie Smarty)?
ein Template für ne GUI ?
Na das gestaltet sich aber schwierig, denn du hast hier 2 komplett verschiedene Sprachen, und mal einfach dynamisch Java-Kompilieren ist net so einfach möglich.
Geben tut es das so in der Form nicht, es gibt aber einige Ansätze GUIs durch XML-Dateien zu erzeugen, google da mal in die Richtung.
 
Hi,

Ups, hatte garnicht den letzten Beitrag gesehen :oops:


Ich habe mich jetzt für Swing entschieden, allerdings stehe ich grad auf den Schlauch.

Code:
	public static void main(String[] args) {
		
		GUI AppWindow = new GUI();
		
		AppWindow.initWindow("Hier kommt der Titel", 420, 180);

		AppWindow.initLabel("Neues Label", 5, 0, 100, 25);

		AppWindow.show();

	}

Code:
	public void initWindow(String title, int width, int height) {
		this.getContentPane().setLayout(null);
		this.setTitle(title);
		this.setSize(width, height);
		
		this.addWindowListener(new WindowListener() {
			public void windowClosed(WindowEvent arg0) {
			}

			public void windowActivated(WindowEvent e) {
			}

			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}

			public void windowDeactivated(WindowEvent e) {
			}

			public void windowDeiconified(WindowEvent e) {
			}

			public void windowIconified(WindowEvent e) {
			}

			public void windowOpened(WindowEvent e) {
			}
		});
		
	}
		
	public void initLabel(String title, int x , int y, int width, int height) {

		JLabel label = new JLabel(title);
		label.setBounds(x, y, width, height);
		this.add(label);

	}

Wie kann ich hinterher (von der Methode Main aus) von initLabel irgendetwas (z.B. die Schriftfarbe) ändern?
In der Methode initLabel ist ja klar, da könnte ich z.B.

Code:
label.setForeground(Color.RED);

machen.

Wie löse ich das denn in der Methode Main?
 
Hi,

Wie kann ich hinterher (von der Methode Main aus) von initLabel irgendetwas (z.B. die Schriftfarbe) ändern?
In der Methode initLabel ist ja klar, da könnte ich z.B.

Code:
label.setForeground(Color.RED);
machen.

Wie löse ich das denn in der Methode Main?

Du müsstest label nicht als lokale Variable sondern als Attribut verwenden.
Code:
class GUI
{
    private JLabel label;
}

Und dann noch einen getter (also eine Methode getLabel(), die dir das JLabel-Objekt zurückgibt implementieren.

Dann kannst du in main mittels
AppWindow.getLabel().setForeground(...) etc, auf dein Label zugreifen.


Und noch ein kleiner Tipp am Rande, wenn du wie in deinem bsp. ein Interfache (WindowListener) einsetzt aber nur eine Methode davon verwenden möchtest, kannst du auch zu einem Adapter( in diesem Fall WindowAdapter) greifen, der per default alle notwendigen Methoden bereits implementiert hat und man nur noch die wirklich notwendigen Methoden überschreiben muss.
 
Hi,

Ok, bislang sieht das ganze so aus:

Code:
	private JLabel label;
	
	public void initWindow(String title, int width, int height) {

		this.getContentPane().setLayout(null);
		this.setTitle(title);
		this.setSize(width, height);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	}
		
	public void initLabel(String title, int x , int y, int width, int height) {

		label = new JLabel(title);
		label.setBounds(x, y, width, height);
		this.add(label);

	}

und

Code:
	public static void main(String[] args) {
		
		GUI AppWindow = new GUI();
		
		AppWindow.initWindow("Hier kommt der Titel", 420, 180);

		AppWindow.initLabel("muh", 250, 20, 50, 10);
		
		AppWindow.show();

	}

Aber den Part mit dem Getter verstehe ich nicht so wirklich. Vorallem weil ich später ja mehrere Labels anwenden möchte :think:
 
Aber den Part mit dem Getter verstehe ich nicht so wirklich. Vorallem weil ich später ja mehrere Labels anwenden möchte :think:
Code:
public JLabel getLabel()
{
  return label;
}
Stichwort Datenkapselung. Du könntest das Label auch public machen nur dann kann jeder daherkommen und wild am Label rumspielen, ohne dass du was davon mitbekommst.

Wenn du mehrere Label verwenden wills, kannst du nach dem gleichen Schema verfahren.
 
Stichwort Datenkapselung. Du könntest das Label auch public machen nur dann kann jeder daherkommen und wild am Label rumspielen, ohne dass du was davon mitbekommst.

Ich hatte mich schon gewundert warum das Attribut auf private ist :ugly: Ok, das leuchtet mir ein :)

Wenn du mehrere Label verwenden wills, kannst du nach dem gleichen Schema verfahren.


Code:
AppWindow.initLabel("muh", 250, 20, 50, 10);
AppWindow.initLabel("test", 250, 30, 50, 10);
AppWindow.getLabel().setForeground(Color.blue);

Wie bekomme ich denn die Schriftfarbe von "muh" in rot? Ich könnte natürlich noch ein Attribut anlegen aber das ganze sollte in gewisser Weise dynamisch sein. D.h. ich weiß nicht wieviele Labels ich verwenden möchte.
 
Wie bekomme ich denn die Schriftfarbe von "muh" in rot? Ich könnte natürlich noch ein Attribut anlegen aber das ganze sollte in gewisser Weise dynamisch sein. D.h. ich weiß nicht wieviele Labels ich verwenden möchte.

Im jetzigen Zustand - gar nicht. Bei jedem Aufruf von initLabel wird eine neue Instanz von JLabel erzeugt, aber nur die jeweils letzte Referenz in label gespeichert.

Du hast jetzt also nur noch Zugriff auf das Label mit dem Text "test", wenn du getLabel aufrufst.

Du musst dich also selbst drum kümmern, die richtigen Label-Objekte wieder zu bekommen. Z.B. jedes einzelne Label als Attribut (muhLabel, testLabel). Oder in einer Datenstruktur (Array, Vector,...).

Die initLabel-Methode müsste dann prüfen, ob es schon ein Label mit dem Inhalt "muh" gibt, falls nein, dann eins anlegen und in die Datenstruktur einfügen. getLabel() müsste dann auch einen Parameter bekommen an Hand dessen dann bestimmt wird, welches Element aus der Datenstruktur zurückgegeben werden soll.