Gui - Grundsätzliche Programmierung

Status
Nicht offen für weitere Antworten.
W

Wes

Gast
Hab vor kurzem angefangen mich mit diesen Gui-Kram zu beschäftigen.
Kurz gesagt: Es ist grässlich, jedes Tutorial macht das anders und stellen fast nur die Grundlagen der Grundlagen dar oder springen sofort in den ( für mich ) Hardcore-Bereich.
Daher frage ich mal hier nach.
1. Wie schreibe ich guten Gui-Code. Mein Beispiel folgt - nehme gerne Vorschläge wegen Strukturierung und Variablen an, z.B. ob es besser wäre das Haupt-JFrame zu einer privaten Klassenvariable zu machen oder zu einer lokalen Variable des Konstruktors.
2. Warum wird meine Größenangabe zum Button nicht angenommen.
3.Wofür ist dieses pack() da? Wenn ich es mache sind die Größeneinstellungen des JFrame weg.

Code:
package grafik;
import javax.swing.*;
import java.awt.*;
public class Hauptbildschirm 
{
	//VARIABLEN----------------------------------------------------
	
	int bildschirmbreite,bildschirmhoehe;
	
	//KONSTRUKTOR--------------------------------------------------
	
	public Hauptbildschirm()
	{
		//JFrame
		JFrame brett = new JFrame("Go for");
		bildschirmbreite = Toolkit.getDefaultToolkit().getScreenSize().width;
		bildschirmhoehe = Toolkit.getDefaultToolkit().getScreenSize().height;
		brett.setSize(Math.round(this.bildschirmbreite/2),Math.round(this.bildschirmhoehe/2));
		brett.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		//Komponenten
		JButton test = new JButton("test");
			test.setLocation(10,10);
			test.setSize(100,200);
		
		brett.getContentPane().add(test);
		brett.setVisible(true);
	};
	
	//METHODEN-----------------------------------------------------
};

mfg Wes
 

Campino

Top Contributor
1. Wie schreibe ich guten Gui-Code. Mein Beispiel folgt - nehme gerne Vorschläge wegen Strukturierung und Variablen an, z.B. ob es besser wäre das Haupt-JFrame zu einer privaten Klassenvariable zu machen oder zu einer lokalen Variable des Konstruktors.
An sich baut man eine Hauptfenster- Klasse, die von JFrame erbt und platziert alles andere auf dieser.

2. Warum wird meine Größenangabe zum Button nicht angenommen.
3.Wofür ist dieses pack() da? Wenn ich es mache sind die Größeneinstellungen des JFrame weg.

Beides hat mit dem LayoutManager zu tun. Dieser Manager hilft dir dabei, die Komponenten im Fenster zu platzieren. Es gibt für verschiedene Zwecke unterschiedliche Manager. Der einfachste ist das "FlowLayout", dass die Komponenten einfach setzt und eine neue Zeile anfängt, wenn das Fenster zu schmal wird.
Dann gibt es noch ein "GridLayout", dass deine Komponents wie in einer Tabelle anordnet usw. (Welche es noch gibt und wie sie funktionieren, wirst du dir wohl doch in irgendeinem Tutorial angucken müssen).
Mit JFrame.getContentPane().setLayoutManager(new WasAuchImmerLayout()) kannst du einstellen, welcher verwendet werden soll. Standardmäßig verwendet das JFrame ein FlowLayout.
Dein Button wird also sobald du ihn zum JFrame addest (Zeile 26) dem LayoutManager gezeigt, der sagt: "Oh, schön, stell es da hin" und überschreibt deine Einstellungen für Höhe und Breite sowie die Position. Deshalb sind die Einstellungen im Button weg.

Auch das pack() hat mit dem Manager zu tun. Hier fragt das Fenster den Manager, wie viel Platz die Komponenten den Brauchen und nimmt dann diese Größe an. Deshalb wird dein Fenster kleiner, wenn du pack() machst.

Auf Dauer solltest du lernen, die LayoutManager einzusetzen. Nur so kann deine Anwendung flexibel reagieren, falls sie plötzlich auf einem kleineren Bildschirm läuft. Komponenten mit absolut gesetzten Koordinaten verschwinden dabei gerne hinter den Bildschirmrändern. LayoutManager bringen alles irgendwie unter.
Für den Anfang, um zu begreifen, wie GUI funktioniert, kann es hilfreich sein, den LayoutManager abzuschalten. Das geht, indem du der oben genannten setLayoutManager- Methode null übergibst. Das ist allerdings nur eine Notlösung, für professionelle Programme ist das kaum geeignet.
 
W

Wes

Gast
Vielen Dank für die Antwort.
Inzwischen haben sich jedoch ein paar neue Fragen ergeben.

Aktueller Codestand:
Code:
package grafik;
import javax.swing.*;
import java.awt.*;
public class Hauptbildschirm 
{
	//VARIABLEN----------------------------------------------------
	
	JFrame haupt;
	
	//KONSTRUKTOR--------------------------------------------------
	
	public Hauptbildschirm(String pfad,int linien)
	{
		//JFrame
		haupt = new JFrame("Go for");
		haupt.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		//Komponenten
		JLabel brett = new JLabel(new ImageIcon(pfad + "\\Images\\brett_" + linien + ".png"));
		JButton test = new JButton("test");
		haupt.getContentPane().add(brett);
		haupt.add(test);
		
		haupt.pack();
		haupt.setVisible(true);
	};
	
	//METHODEN-----------------------------------------------------
};
1. Wo ist der Unterschied zwischen .getContentPane().add und einem einfachen .add()
2. Wenn ich das so ausführe wird nur der Button angezeigt, vertausche ich aber die Parameter der beiden add-Prozeduren so wird das Bild angezeigt.
 
B

bananenkasper

Gast
Wes hat gesagt.:
1. Wo ist der Unterschied zwischen .getContentPane().add und einem einfachen .add()
2. Wenn ich das so ausführe wird nur der Button angezeigt, vertausche ich aber die Parameter der beiden add-Prozeduren so wird das Bild angezeigt.

Ein JFrame ist standardmässig schon mit Components gefüllt.
Unter anderem auch die ContentPane, in die du normalerweise deinen Inhalt packen solltest. (getContentpane().add())
machst du einfach JFrame.add(), wird der ContentPane-Inhalt davon überdeckt.
 

André Uhres

Top Contributor
Wes hat gesagt.:
1. Wo ist der Unterschied zwischen .getContentPane().add und einem einfachen .add()
JFrame#add ist lediglich eine Abkürzung von JFrame#getContenPane().add,
beide Schreibweisen sind gleichwertig, erstere funktioniert aber erst seit Java 1.5.

Wes hat gesagt.:
2. Wenn ich das so ausführe wird nur der Button angezeigt,
vertausche ich aber die Parameter der beiden add-Prozeduren so wird das Bild angezeigt.
Standardmäßig verwendet das JFrame ein BorderLayout (nicht FlowLayout, wie Campino irrtümlich schrieb).
BorderLayout hat 5 Bereiche: CENTER und einen an jeder Seite. Wenn man im add(..) keinen Bereich angibt,
ist CENTER gemeint. Im CENTER kann aber nur eine einzige Komponente sein.
Darum ist von deinen beiden add(..) Aufrufen immer nur der letzte wirksam.
Siehe auch: Using Layout Managers
 
G

Guest

Gast
Danke für die Antworten.
Diese Layouts sind zwar ganz nett, aber ich bekomme meine Idee mit keiner der vorhandenen hin.
Das hier ist die Vorstellung:


Jedoch scheinen mir ( auch nach bissl rumtesten ) alle Layouts untauglich dafür.
 

Verjigorm

Top Contributor
Du kannst Layouts verschachteln

Also in deinem Bsp:

"Links" wäre dein Center vom BorderLayout (West bleibt leer und wird quasi ignoriert)
"Rechts" wäre dein East vom BorderLayout, in das du ein JPanel addest.
Dieses JPanel wiederrum kannst du ebenfalls einen LayoutManager verpassen.
Wieder Borderlayout, North, Center, South usw.

Oder du benutzt GridBagLayout, welches grade am Anfang doch sehr schwer verdaulich ist ;)

Generell solltest du dir halt erstmal das Sun-Tutorial anschauen, welches oben schon verlinkt wurde.
 

Ark

Top Contributor
Code:
BorderLayout
|
|__CENTER
|  |
|  |__[Bild]
|
|__EAST
   |
   |__BorderLayout
      |
      |__NORTH
      |  |
      |  |__GridLayout
      |     |
      |     |__[Label 1]
      |     |
      |     |__[Label 2]
      |     |
      |     |__[Label 3]
      |     |
      |     |__[Label 4]
      |     |
      |     |__[Label 5]
      |     |
      |     |__[Label 6]
      |
      |__SOUTH
         |
         |__GridLayout
            |
            |__[Button 3]
            |
            |__[Button 2]
            |
            |__[Button 1]
So würde ich das umsetzen.

Ark
 
G

Guest

Gast
Das ganze könnte z.B. so aussehen

Code:
package de;

import java.awt.BorderLayout;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TestGUI extends JFrame {
	private JPanel bildPanel, navigationPanel, labelPanel, buttonPanel;

	public TestGUI() {
		getContentPane().setLayout(new BorderLayout());
		bildPanel = createBildPanel();
		navigationPanel = createNavigationPanel();
		labelPanel = createLabelPanel();
		buttonPanel = createButtonPanel();
		this.add(bildPanel, BorderLayout.CENTER);
		this.add(navigationPanel, BorderLayout.EAST);
		navigationPanel.add(labelPanel, BorderLayout.NORTH);
		navigationPanel.add(buttonPanel, BorderLayout.SOUTH);
		setSize(400, 300);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);

	}

	private JPanel createButtonPanel() {
		JPanel panel = new JPanel();
		panel.setLayout(new GridLayout(0, 1));
		for (int i = 0; i < 3; i++) {
			panel.add(new JButton("Button " + (i + 1)));
		}

		return panel;
	}

	private JPanel createLabelPanel() {
		JPanel panel = new JPanel();
		panel.setLayout(new GridLayout(0, 2));
		for (int i = 0; i < 6; i++) {
			panel.add(new JLabel("Label " + (i + 1)));
		}
		return panel;
	}

	private JPanel createNavigationPanel() {
		JPanel panel = new JPanel();
		panel.setLayout(new BorderLayout());

		return panel;
	}

	private JPanel createBildPanel() {
		// TODO Auto-generated method stub
		JPanel panel = new JPanel();
		panel.add(new JLabel("Bild"));
		return panel;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				new TestGUI();
			}

		});
	}

}
 

florian1x

Aktives Mitglied
Ich stimmte args tree zu und würds so amchen

Code:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class BspGUI extends JFrame{
	
	private int breite, hoehe;
	
	private JPanel main, side;
	private JPanel sideHead, sideFoot;
	
	private JLabel Label1,Label2,Label3,Label4,Label5,Label6;
	private JButton Button1, Button2, Button3;
	
	public BspGUI(){
		//Fenstereinstellungen
		breite = (int)Math.round(Toolkit.getDefaultToolkit().getScreenSize().width / 2); 
		hoehe = (int)Math.round(Toolkit.getDefaultToolkit().getScreenSize().height / 2); 
		this.setPreferredSize(new Dimension(breite, hoehe));
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
		this.setLayout(new BorderLayout());
		
		//Pannels
		main = new JPanel();
		side = new JPanel();
		sideHead = new JPanel();
		sideFoot = new JPanel();
		
		side.setLayout(new BorderLayout());
		sideHead.setLayout(new GridLayout(6,1));
		sideFoot.setLayout(new GridLayout(3,1));
		
		//Labels
		Label1 = new JLabel("Label 1");
		Label2 = new JLabel("Label 2");
		Label3 = new JLabel("Label 3");
		Label4 = new JLabel("Label 4");
		Label5 = new JLabel("Label 5");
		Label6 = new JLabel("Label 6");
		
		//Buttons
		Button1 = new JButton("Button 1");
		Button2 = new JButton("Button 2");
		Button3 = new JButton("Button 3");
		
		//Alles zusammen manschen
		this.add(main, BorderLayout.CENTER);
		this.add(side, BorderLayout.EAST);
		
		side.add(sideHead,BorderLayout.NORTH);
		sideHead.add(Label1);
		sideHead.add(Label2);
		sideHead.add(Label3);
		sideHead.add(Label4);
		sideHead.add(Label5);
		sideHead.add(Label6);
		
		side.add(sideFoot,BorderLayout.SOUTH);
		sideFoot.add(Button1);
		sideFoot.add(Button2);
		sideFoot.add(Button3);
		
		//sonstiges
		this.pack();
		this.setVisible(true);
		
	}
	
	public static void main(String[] args) {
		new BspGUI();
	}
}

müsste eigentlich das sein was gesucht ist, habs aber nru hier rein geschrieben und nicht getestet.
 
W

Wes

Gast
Danke für die Antworten.
Eure Beispiele funktionieren gut, ich habe es vorher ein bisschen anders gemacht bei gleichem Ergebnis und werde daher doch vorerst bei meinem bleiben.

Ich glaube sowieso das ich das alles später nochmal umwerfen muss ;)
 

florian1x

Aktives Mitglied
jops mach das
ich mach auch immer lieber alles selber als abzuschreiben
aber vergleichen und dann verbessern tu ich auch gerne ^^
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Grundsätzliche Frage zu return Types in Methoden Java Basics - Anfänger-Themen 6
DStrohma Grundsätzliche Fragen zu Drag & Drop Java Basics - Anfänger-Themen 1
S Grundsätzliche Programmstruktur planen Java Basics - Anfänger-Themen 5
B Grundsätzliche Klassen-Struktur/Stil Java Basics - Anfänger-Themen 12
C Grundsätzliche Fragen zu Objekten Java Basics - Anfänger-Themen 6
F Grundsätzliche Frage zu GUI's. Java Basics - Anfänger-Themen 5
M Grundsätzliche Fragen Java Basics - Anfänger-Themen 3
J Grundsätzliche Fragen zur Anwendung von Applets Java Basics - Anfänger-Themen 12
M Java Programmierung Aufgabe Anfänger Java Basics - Anfänger-Themen 1
F Automat-Programmierung Java Basics - Anfänger-Themen 30
N Lambdas, Methodenref, fkt Programmierung ? Java Basics - Anfänger-Themen 10
districon Dynamisch Programmierung/Backtracking/Memoization Java Basics - Anfänger-Themen 3
S Buchstaben Programmierung Bedeutung Java Basics - Anfänger-Themen 4
S Hilfe bei Programmierung einer Hotelabrechnung Java Basics - Anfänger-Themen 5
enjoykimii Strukturierte Programmierung Hilfe Java Basics - Anfänger-Themen 29
A Frage zur programmierung Java Basics - Anfänger-Themen 12
Nerdinfekt Programmieranfänger, Schwierigkeiten mit der Programmierung Java Basics - Anfänger-Themen 6
U Compiler-Fehler Programmierung einer Drehkugel Java Basics - Anfänger-Themen 8
L Programmierung mit Hash Java Basics - Anfänger-Themen 3
C Wie habt Ihr angefangen mit der Java Programmierung, ohne Programmiervorkenntnisse Java Basics - Anfänger-Themen 8
J Problem bei der Programmierung eines Tannenbaums Java Basics - Anfänger-Themen 9
S GUI-Programmierung Sudoku-Rätsel lösen Java Basics - Anfänger-Themen 1
B Fibonacci Zahlen dynamische Programmierung Java Basics - Anfänger-Themen 7
S Programmierung simulieren - aber wie?! Java Basics - Anfänger-Themen 3
H Java Programmierung Java Basics - Anfänger-Themen 3
W Problem bei Programmierung von Monte-Carlo-Integration Java Basics - Anfänger-Themen 12
D Guten Tag mache gerade eine Umschulung zum FiSi war leider jetzt 2 Wochen Krank und wir hatten Prozendurale Programmierung. Java Basics - Anfänger-Themen 3
P Rechnen mit Brüchen - objektorientierte Programmierung Java Basics - Anfänger-Themen 18
D Objektorientierte Programmierung Java Basics - Anfänger-Themen 13
F Attribute bei Objektorientierter Programmierung Java Basics - Anfänger-Themen 11
F Ich brauche Hilfe bei Objektorientierter Programmierung... Java Basics - Anfänger-Themen 19
F Problem beim entfernen von mehreren Listenelementen auf einmal (Programmierung des Spiels Arschloch) Java Basics - Anfänger-Themen 1
Q Objektorientierte Programmierung Java Basics - Anfänger-Themen 17
J Texte für Java Programmierung besser verstehen? Java Basics - Anfänger-Themen 2
C GUI Programmierung unter Windows mit Java womit? Java Basics - Anfänger-Themen 11
D Collections Aufgaben Java-Programmierung Überforderung Java Basics - Anfänger-Themen 36
A GUI Programmierung mit Textfield Java Basics - Anfänger-Themen 3
J Programmierung Quiz Spiel Java Basics - Anfänger-Themen 3
J Programmierung Quiz Spiel Java Basics - Anfänger-Themen 2
U Brauche Hilfe bei Programmierung einer Produktdatenbank App Java Basics - Anfänger-Themen 4
L Dynamische Programmierung Java Basics - Anfänger-Themen 0
J Verschieden Fragen über Java Programmierung Java Basics - Anfänger-Themen 3
A Methoden Habe ein Problem bei folgender Programmierung Java Basics - Anfänger-Themen 15
slejden Erste Schritte Frage zur OOP (objektorientierten Programmierung Java Basics - Anfänger-Themen 4
V Threads Nebenläufige Programmierung Java Basics - Anfänger-Themen 6
V Nebenläufige Programmierung Java Basics - Anfänger-Themen 5
Henri Paare Frage über Java Programmierung Java Basics - Anfänger-Themen 10
S Programmierung eines Geldwechselautomaten! Java Basics - Anfänger-Themen 2
R Einige Neulingsfragen (Wrapper, GUI-Programmierung) Java Basics - Anfänger-Themen 4
D JavaBeans und die visuelle Programmierung Java Basics - Anfänger-Themen 2
M Dringend Experten für Scala-Play basierte Programmierung!!!! Java Basics - Anfänger-Themen 0
Z Programmierung eines Stacks Java Basics - Anfänger-Themen 19
A Programmierung herangehensweise Java Basics - Anfänger-Themen 9
T Objektorientierte Programmierung - Kein Plan wieso das nicht funktioniert! Java Basics - Anfänger-Themen 6
G 3D-Spiele-Programmierung Java Basics - Anfänger-Themen 3
I Programmierung-Hausaufgabe: Hilfe benötigt Java Basics - Anfänger-Themen 8
R Kann jemand diese Java Programmierung machen? Versteh ich leider nicht Java Basics - Anfänger-Themen 17
T Nachhilfe JAVA Programmierung Java Basics - Anfänger-Themen 1
R Schaffe es nicht Random-Programmierung zu vollenden. Wo liegt der Fehler in diesem Code? Java Basics - Anfänger-Themen 13
N Socket-Programmierung Java Basics - Anfänger-Themen 4
kaoZ Android Programmierung / Erstellen einer neuen Instanz Java Basics - Anfänger-Themen 2
O OOP Input & Output in der GUI-Programmierung Java Basics - Anfänger-Themen 2
O Java Grafik-Programmierung? Java Basics - Anfänger-Themen 16
F Fehler bei Array und Index Programmierung Java Basics - Anfänger-Themen 18
K Objektorientierten Programmierung Java Basics - Anfänger-Themen 3
R Einstieg in Programmierung Java Basics - Anfänger-Themen 8
W Problem bei MineSweeper Programmierung Java Basics - Anfänger-Themen 10
N Objektorientierte Programmierung: Erben von 2 Klassen - wie ist korrekte Vorgehensweise? Java Basics - Anfänger-Themen 16
D Best Practise für Programmierung Java Basics - Anfänger-Themen 7
D Erste Schritte Einstieg in die Java Spiel Programmierung Java Basics - Anfänger-Themen 7
W objektorientierte Programmierung Java Basics - Anfänger-Themen 25
W objektorientierte Programmierung - String in andere Klasse übergeben Java Basics - Anfänger-Themen 13
E Algorithmen und Programmierung - Datum und Zeit ausgeben? Java Basics - Anfänger-Themen 8
Grejak OOP Einstieg in Objekt-Orientierte-Programmierung Java Basics - Anfänger-Themen 3
D Frage zu Bit Operatoren in der Programmierung Java Basics - Anfänger-Themen 9
U Geräte-Programmierung ? Java Basics - Anfänger-Themen 15
S 2 kurz Fragen zur Möglichkeit der Programmierung Java Basics - Anfänger-Themen 7
T Objektorientierte Programmierung, わからない です Java Basics - Anfänger-Themen 6
J Allgemeine Fragen zur Programmierung Java Basics - Anfänger-Themen 36
N Grafische Programmierung mit jeweils anderen Bildern bei versch. Ergebnissen Java Basics - Anfänger-Themen 9
S Objektorientierte Programmierung Java Basics - Anfänger-Themen 21
M Gui Programmierung Java Basics - Anfänger-Themen 21
J Spielevorschläge für Programmierung Java Basics - Anfänger-Themen 3
O Eisenbahn-Programmierung Java Basics - Anfänger-Themen 8
S Schlechte Programmierung Java Basics - Anfänger-Themen 5
O Probleme bei OO-Programmierung mit Vererbung Java Basics - Anfänger-Themen 18
M Programmierung kürzen??? Java Basics - Anfänger-Themen 5
N Umstieg auf objektorintierte Programmierung Java Basics - Anfänger-Themen 2
N Probleme mit meiner Programmierung Java Basics - Anfänger-Themen 5
M Meine erste Java Programmierung funzt nicht :-( Java Basics - Anfänger-Themen 34
H Programmierung Ampelsteuerung Java Basics - Anfänger-Themen 4
J [Erledigt] Applet Programmierung Java Basics - Anfänger-Themen 4
C Objektorientierte Programmierung Java Basics - Anfänger-Themen 11
T Gui Programmierung lernen Java Basics - Anfänger-Themen 3
E Toolkit (Scanner) Programmierung Java Basics - Anfänger-Themen 5
D Programmierung Profi Java Basics - Anfänger-Themen 18
G Problem bei Programmierung Java Basics - Anfänger-Themen 15
X Objektorientierte Java Programmierung - 3 Fragen zum Code Java Basics - Anfänger-Themen 5
G Problem bei Programmierung Java Basics - Anfänger-Themen 2
G thread programmierung für ANFÄNGER Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben