Swing Positionierung von Komponenten

raffi

Mitglied
Hallo, ich arbeite mich ja derzeit gerade in Swing ein. Dabei bin ich mal wieder auf ein problem gestoßen, welches ich nicht so recht lösen kann bzw. ich das Vorgehen nicht verstehe.
Es geht darum, das ich vorerst ohne Aktionen eine Oberfläche ähnlich eines Formulares erstelle. Leider scheitert es schon daran, Labels und die zugehörigen TextFields ordentlich nebeneinander bzw. untereinander zu positionieren. Besondere Schwierigkeiten machen mir wahrscheinlich die LayoutManager.
Wie im Quelltext zu sehen habe ich zumindest schonmal die Navi oben angepappt. Als nächstes wollte ich die Labels mithilfe von PAGE_START auf die Linke Seite bringen, unterhalb der navi. Das klappte soweit auch gut, bis auf das letzte Label, welches links ganz am Rand, trotz der manuellen Ausrichtung, hängt. Die TextFields wollte ich in die Mitte des Fensters jeweils auf Höhe des zugehörigen labels platzieren, aber auch das endete in einem optischen Fiasko sozusagen. :)
Nun hatte ich mir gedacht ich baue unterhalb der Navi ein panel ein mit GridLayout, das Ergebnis könnt ihr sehen. Wie bekomme ich denn nun die Textfields in die Spalte 2 und alle Label in die Spalte 1? Und warum sind die TextFields innerhlab des neuen Panels alle gleichgroß? Muss ich die manuell Positionierung im neuen Panel vornehmen?

Java:
public class ProfFenster {

	JFrame frame;
	JToolBar bar;
	JButton anzeigen;
	JButton suchen;
	JButton profAnlegen;
	JButton vAnlegen;
	JButton schließen;
	AbstractAction myAction;
	JLabel pNameL;
	JLabel pKuerzelL;
	JLabel pMailL;
	JLabel pMzahlL;
	JLabel vNameL;
	JLabel vTypL;
	JLabel vZeitL;
	JLabel vBetreutL;
	JTextField pNameT;
	JTextField pKuerzelT;
	JTextField pMailT;
	JTextField pMzahlT;
	JTextField vNameT;
	JTextField vTypT;
	JTextField vZeitT;
	JTextField vBetreutT;
	GridLayout inLay;
	JPanel panel;
	
	public ProfFenster () {
		createActions();
		frame = new JFrame("Uni-Verwaltung");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLayout(new BorderLayout());
		bar = new JToolBar("Datei");
		anzeigen = new JButton("Alle Daten anzeigen");
		suchen = new JButton("Professur suchen");
		profAnlegen = new JButton("Profesur anlegen");
		vAnlegen = new JButton("Veranstaltung anlegen");
		schließen = new JButton("Schließen");
		pNameL = new JLabel("Name der Professur: ");
		pKuerzelL = new JLabel("Kuerzel der Professur: ");
		pMailL = new JLabel("Kontaktadresse der Professur: ");
		pMzahlL = new JLabel("Mitarbeiterzahl der Professur: ");
		pNameT = new JTextField(75);
		pKuerzelT = new JTextField(3);
		pMailT = new JTextField(75);
		pMzahlT = new JTextField(2);
		vNameT = new JTextField(75);
		vTypT = new JTextField(10);
		vZeitT = new JTextField(3);
		vBetreutT = new JTextField(4);
		pNameL.setBounds(10, 50, 300, 100);
		pKuerzelL.setBounds(10, 75, 300, 100);
		pMailL.setBounds(10, 100, 300, 100);
		pMzahlL.setBounds(10, 125, 300, 100);
		pNameT.setBounds(200, 50, 150, 100);
		pKuerzelT.setBounds(200, 75, 3, 100);
		pMailT.setBounds(200, 100, 150, 100);
		pMzahlT.setBounds(200, 125, 2, 100);
		
		bar.add(anzeigen);
		bar.add(suchen);
		bar.add(profAnlegen);
		bar.add(vAnlegen);
		bar.add(schließen);
		frame.add(bar, BorderLayout.PAGE_START);
		inLay = new GridLayout(5, 2);
		panel = new JPanel(inLay);
		panel.add(pNameL);
		panel.add(pKuerzelL);
		panel.add(pMailL);
		panel.add(pMzahlL);
		panel.add(pNameT);
		panel.add(pKuerzelT);
		panel.add(pMailT);
		panel.add(pMzahlT);
		frame.add(panel);
		
		frame.pack();
		frame.setVisible(true);
	}
	
	public static void main (String[] args) {
		SwingUtilities.invokeLater(new Runnable () {
			public void run () {
				new ProfFenster();
			}
		});
	}
}

MfG und danke
 

Ebenius

Top Contributor
Das GridLayout soll doch 4 Zeilen haben und nicht 5, oder?

Ansonsten verstehe ich Deine Vorstellung vom gewünschten Layout nicht ganz. Wieso zeichnest Du nicht fix ein Bild. Oder mach die gewünschte Anordnung in einem [noparse]
Code:
[/noparse]-Block klar, zum Beispiel: [code]
---------------------------------------------------------------------
|  T  |  nameLabel:        [nameTextField                         ] |
|  O  |                                                             |
|  O  |                                                             |
|  L  |                                                             |
|  B  |                                                             |
|  A  |                                                             |
|  R  |                                                             |
---------------------------------------------------------------------
Ebenius
 

raffi

Mitglied
Hallo,
es müssen natürlich nur 4 Zeilen sein ja...aber da ist ja erstmal nicht ganz so schlimm.
OK, ich mach mal nen Bild:

Code:
------------------------------------------------
     Navi                                                        
------------------------------------------------
    Und hier soll                                               
     dann alles passieren (Eingabe- und Ausgabe)  
     Label: TextField                                                              
     Label: TextField z. B.                                                              
------------------------------------------------

Worauf das Programm hinausläuft dürfte ersichtlich sein. Ich möchte nun im Endergebnis, wenn ich zum Beispiel auf den Button "Professur anlegen" klicke ein Formular mit Labels und TextFields im Teil "Und hier sol alles passieren" haben. Mir geht es auch nur erstmal um die Positionierung, noch nicht um das Auslösen bzw. das Erscheinen des Formulars. Später soll auch im selben Abschnitt alles angezeigt werden, was bisher erfasst wurde, also welche Professuren mit den zugehörigen Lehrveranstaltungen.
Aber wie gesagt, Probleme macht mir derzeit jeder Layout Manager, also zumindest Verständnisprobleme. Wie z. B. kann ich im GridLayout auf einzelne Zellen zugreifen oder geht das garnicht?
Ich hoffe das ist soweit erstmal verständlich.

MfG
 
Zuletzt bearbeitet:

noobadix

Bekanntes Mitglied
Hallo,

ich mag GridBagLayout, das dem GridLayout ähnlich ist, aber dieses kenne ich nicht. Das läuft da so, dass du eine sogenannte GridBagConstraints erstellst, die mehrere Instanzvariablen besitzt, die du deinen Bedürfnissen entsprechend modifizieren kannst und diese GBC wird dann dem Panel zusammen mit der Component übergeben. Spalten und Reihen werden mit GBC.gridy und GBC.gridx durch integer-Werte angegeben, also um in der ersten Reihe und Spalte zu arbeiten wird GBC.gridx=1 und GBC.gridy=1 gesetzt. Das Schöne ist, dass du auch mit GBC.gridwith oder GBC.gridheight (ebenso mit int-Werten) angeben kannst, über wie viele Spalten/Reihen sich die gewünschte Zelle strecken soll. Hier mal n Beispiel:

Code:
=======================
-------------Navigation------------
----LABEL--- | ---TEXTFELD---
=======================

Java:
JPanel testPanel = new JPanel();
JLabel aL = new JLabel("LabelA")
JTextFied tF = new JTextField(20);
JLabel bL = new JLabel("LabelB")
JTextFied bT = new JTextField(20);
JButton a=new JButton("a!");
JButton b=new JButton("b!");
JPanel buttonPanel = new JPanel();
buttonPanel.add(a);
buttonPanel.add(b);

testPanel.setLayout(new GridBagLayout();
GridBagConstraints gbc = new GridBagConstraints();

gbc.anchor = GridBagConstraints.NORTHWEST;
gbc.fill = GridBagConstraints.BOTH;

gbc.gridwith = 2;

testPanel.add(buttonPanel);

gbc.gridy=2;
gbc.gridwith=1;

testPanel.add(aL, gbc);

gbc.gridx=2;

testPanel.add(aT, gbc);

a.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e){
      testPanel.remove(aL);
      testPanel.remove(aT);
      gbc.gridx=2;
      gbc.gridy=1;
      testPanel.add(bL,gbc);
      gbc.gridx=2;
      testPanel.add(bT, gbc);
   });

Habs nicht getestet, sollte aber schön aussehen.
 

raffi

Mitglied
Also ich habe mit Hilfe von nachschlagen und dem Quelltext das GridBagLayout verstanden. Nun wollte ich es einmal für mein Beispiel umsetzen. Leider sind aber Komponenten nebeneinander auf einer Zeile, aber warum?

Java:
public class ProfFenster {

	JFrame frame;
	JToolBar bar;
	JButton anzeigen;
	JButton suchen;
	JButton profAnlegen;
	JButton vAnlegen;
	JButton schließen;
	AbstractAction myAction;
	JLabel pNameL;
	JLabel pKuerzelL;
	JLabel pMailL;
	JLabel pMzahlL;
	JLabel vNameL;
	JLabel vTypL;
	JLabel vZeitL;
	JLabel vBetreutL;
	JTextField pNameT;
	JTextField pKuerzelT;
	JTextField pMailT;
	JTextField pMzahlT;
	JTextField vNameT;
	JTextField vTypT;
	JTextField vZeitT;
	JTextField vBetreutT;
	GridBagConstraints gbc;
	GridBagConstraints labels;
	GridBagConstraints textFields;
	JPanel panel;
	
	public ProfFenster () {
		createActions();
		frame = new JFrame("Uni-Verwaltung");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLayout(new GridBagLayout());
		panel = new JPanel();
		gbc = new GridBagConstraints();
		labels = new GridBagConstraints();
		textFields = new GridBagConstraints();
		bar = new JToolBar("Datei");
		anzeigen = new JButton("Alle Daten anzeigen");
		suchen = new JButton("Professur suchen");
		profAnlegen = new JButton("Profesur anlegen");
		vAnlegen = new JButton("Veranstaltung anlegen");
		schließen = new JButton("Schließen");
		pNameL = new JLabel("Name der Professur: ");
		pKuerzelL = new JLabel("Kuerzel der Professur: ");
		pMailL = new JLabel("Kontaktadresse der Professur: ");
		pMzahlL = new JLabel("Mitarbeiterzahl der Professur: ");
		pNameT = new JTextField(75);
		pKuerzelT = new JTextField(3);
		pMailT = new JTextField(75);
		pMzahlT = new JTextField(2);
		vNameT = new JTextField(75);
		vTypT = new JTextField(10);
		vZeitT = new JTextField(3);
		vBetreutT = new JTextField(4);
		/*pNameL.setBounds(10, 50, 300, 100);
		pKuerzelL.setBounds(10, 75, 300, 100);
		pMailL.setBounds(10, 100, 300, 100);
		pMzahlL.setBounds(10, 125, 300, 100);
		pNameT.setBounds(200, 50, 150, 100);
		pKuerzelT.setBounds(200, 75, 3, 100);
		pMailT.setBounds(200, 100, 150, 100);
		pMzahlT.setBounds(200, 125, 2, 100);*/
		frame.add(panel);
		
		gbc.gridx = 0;
		gbc.gridy = 0;
		gbc.gridwidth = 2;
		gbc.gridheight = 1;
		bar.add(anzeigen);
		bar.add(suchen);
		bar.add(profAnlegen);
		bar.add(vAnlegen);
		bar.add(schließen);
		//frame.add(bar);
		
		labels.gridy = 1;
		labels.gridx = 0;
		labels.gridwidth = 1;
		//frame.add(pNameL, gbc);
		labels.gridy = 2;
		labels.gridx = 0;
		labels.gridwidth = 1;
		//frame.add(pKuerzelL, gbc);
		labels.gridy = 3;
		labels.gridx = 0;
		labels.gridwidth = 1;
		//frame.add(pMailL, gbc);
		labels.gridy = 4;
		labels.gridx = 0;
		labels.gridwidth = 1;
		//frame.add(pMzahlL, gbc);

		textFields.gridy = 1;
		textFields.gridx = 1;
		textFields.gridwidth = 1;
		//frame.add(pNameT, gbc);
		textFields.gridy = 2;
		textFields.gridx = 1;
		textFields.gridwidth = 1;
		//frame.add(pKuerzelT, gbc);
		textFields.gridy = 3;
		textFields.gridx = 1;
		textFields.gridwidth = 1;
		//frame.add(pMailT, gbc);
		textFields.gridy = 4;
		textFields.gridx = 1;
		textFields.gridwidth = 1;
		//frame.add(pMzahlT, gbc);
		
		panel.add(bar, gbc);
		panel.add(pNameL, labels);
		panel.add(pKuerzelL, labels);
		panel.add(pMailL, labels);
		panel.add(pMzahlL, labels);
		panel.add(pNameT, textFields);
		panel.add(pKuerzelT, textFields);
		panel.add(pMailT, textFields);
		panel.add(pMzahlT, textFields);
		frame.pack();
		frame.setVisible(true);
	}
}
 

XHelp

Top Contributor
1. Du musst du dem Panel GridBagLayout zuweisen und nicht dem Frame.
2. Du überschreibst doch ständig die Werte bei den GridBagConstraints

Versuch mal dir die GUI mit Jigloo zu bauen. Für größere Projekte ist der Builder nix, aber gut genug, damit du verstehst, wie die LayoutManager funktionieren.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H LayoutManager Probleme mit Positionierung/Abständen der Komponenten AWT, Swing, JavaFX & SWT 14
J Punkt-genaue Positionierung von SWT-Komponenten AWT, Swing, JavaFX & SWT 10
A Positionierung von Komponenten in JFrame AWT, Swing, JavaFX & SWT 6
H JavaFX Gedrehter Text auf Canvas (Positionierung) AWT, Swing, JavaFX & SWT 6
Ernesto95 JavaFX Absolute Positionierung und Skalierung AWT, Swing, JavaFX & SWT 1
B LayoutManager Positionierung von Buttons´s AWT, Swing, JavaFX & SWT 2
Kenan89 LayoutManager MigLayout Positionierung von Panels AWT, Swing, JavaFX & SWT 4
S Swing Positionierung eines Labels in einem Panel AWT, Swing, JavaFX & SWT 2
B LayoutManager Positionierung zwischen zwei Layoutkomponenten AWT, Swing, JavaFX & SWT 2
Q Dynamische Zahl und Positionierung von Objekten AWT, Swing, JavaFX & SWT 5
Strahlungsleck Swing Positionierung von Elementen im GridBagLayout AWT, Swing, JavaFX & SWT 2
M jPopupMenu - Problem bei der Positionierung AWT, Swing, JavaFX & SWT 3
V textarea Problem Positionierung AWT, Swing, JavaFX & SWT 2
X Relative positionierung in einem JInternalFrame AWT, Swing, JavaFX & SWT 3
F Graphics2D scale und Positionierung einer TextArea AWT, Swing, JavaFX & SWT 8
G positionierung des eingabefensters AWT, Swing, JavaFX & SWT 2
R JFrame -- Variable Positionierung durch Window Manager? AWT, Swing, JavaFX & SWT 2
D Probleme bei der Positionierung von JPopupMenu AWT, Swing, JavaFX & SWT 2
K Positionierung in der Menüleiste AWT, Swing, JavaFX & SWT 3
D Swing Komponenten nicht sichtbar nach Start AWT, Swing, JavaFX & SWT 12
H Fehler: Zum Ausführen dieser Anwendung benötigte JavaFX-Runtime-Komponenten fehlen AWT, Swing, JavaFX & SWT 44
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
BabySuna Swing Komponenten auslagern auf separate Datei AWT, Swing, JavaFX & SWT 8
B Mit ContentPane werden Komponenten angezeigt, mit SplitPane, JPanel nicht? AWT, Swing, JavaFX & SWT 6
P AWT Einzelne Komponenten zur Laufzeit austauschen? AWT, Swing, JavaFX & SWT 3
D [Swing] Anordnung von Komponenten mit GridLayout Manager AWT, Swing, JavaFX & SWT 13
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
E Komponenten von JScrollPane werden nicht richtig ermittelt AWT, Swing, JavaFX & SWT 2
F Gebundene Eigenschaften bei Komponenten mit NetBeans verarbeiten AWT, Swing, JavaFX & SWT 3
dereki2000 Swing JFrame nah hinzufügen von Komponenten akualisieren. AWT, Swing, JavaFX & SWT 2
L Swing Komponenten erst nach Resize sichtbar AWT, Swing, JavaFX & SWT 2
S Swing Panel übernimmt komponenten von anderem AWT, Swing, JavaFX & SWT 7
T Reihenfolge der Komponenten im einem JFrame AWT, Swing, JavaFX & SWT 8
P Gleichmäßige Anodnung von Komponenten im migLayout AWT, Swing, JavaFX & SWT 2
DaCrazyJavaExpert Swing Komponenten genauer anordnen. AWT, Swing, JavaFX & SWT 13
DaCrazyJavaExpert Swing Komponenten in GridBagLayout werden Falsch angeordnet AWT, Swing, JavaFX & SWT 1
P Größe und Ausrichtung von Komponenten festlegen AWT, Swing, JavaFX & SWT 13
MaxG. Swing Swing Komponenten zur Laufzeit hinzufügen AWT, Swing, JavaFX & SWT 2
D Swing Komponenten Anordnung eines Panels in Verbindung eines weiteren Panels AWT, Swing, JavaFX & SWT 9
N Swing Wie Programm strukturieren? (Dynamisch Komponenten hinzufügen) AWT, Swing, JavaFX & SWT 1
Neumi5694 LookAndFeel Look & Feel nicht angezeigter Komponenten ändern AWT, Swing, JavaFX & SWT 6
D JavaFX GUI Komponenten werden langsam bei größerer Datenmenge AWT, Swing, JavaFX & SWT 6
R Komponenten von JPanel bleiben unsichtbar AWT, Swing, JavaFX & SWT 2
D JavaFX Welche Komponenten vermisst ihr? Welche wären essenziell notwendig? AWT, Swing, JavaFX & SWT 8
M Datei mit Komponenten einbinden AWT, Swing, JavaFX & SWT 7
T SWT Externer zugrif auf SWT Komponenten AWT, Swing, JavaFX & SWT 3
Shams Probleme bei dem Hinzufügen von Komponenten zu einem JFrame AWT, Swing, JavaFX & SWT 3
J MouseOver bei Komponenten AWT, Swing, JavaFX & SWT 9
S Größe der Komponenten, beim ändern der größe des Frames, mit ändern! AWT, Swing, JavaFX & SWT 2
D LayoutManager GUI skalieren und deren Komponenten mit Grid(Bag)Layout-Manager. AWT, Swing, JavaFX & SWT 5
G Komponenten vergrößern sich nicht trotz Layoutmanager AWT, Swing, JavaFX & SWT 24
M JavaFX Scenebuilder eigene Komponenten AWT, Swing, JavaFX & SWT 8
A Swing per JComboBox gewünschtes Attribut auswählen und Komponenten passen sich an AWT, Swing, JavaFX & SWT 7
A JavaFX Eigene Komponenten im Scene Builder AWT, Swing, JavaFX & SWT 0
Q Swing Fenster updaten - Hinzugefügte Komponenten darstellen AWT, Swing, JavaFX & SWT 3
S BoxLayout: Anordnung der Komponenten links statt zentriert AWT, Swing, JavaFX & SWT 0
Bartertown JTable - Verschiedene Komponenten in einer Spalte unterbringen AWT, Swing, JavaFX & SWT 3
U Frame zeigt keine Komponenten AWT, Swing, JavaFX & SWT 7
G Applet Applet Komponenten flackern AWT, Swing, JavaFX & SWT 10
K LayoutManager Probleme mit 2 Komponenten AWT, Swing, JavaFX & SWT 9
M Komponenten übereinander AWT, Swing, JavaFX & SWT 7
R Komponenten werden erst nach maximierung des Frames sichtbar (Linux) AWT, Swing, JavaFX & SWT 5
H Swing Getter für GUI-Komponenten AWT, Swing, JavaFX & SWT 3
B Komponenten in Fenster verdrängen sich untereinander AWT, Swing, JavaFX & SWT 6
N Komponenten übereinander AWT, Swing, JavaFX & SWT 3
S Anordnung von GUI-Komponenten mit LayouManger (Problem beim anzeigen von JTextField) AWT, Swing, JavaFX & SWT 5
M Swing Komponenten enablen? AWT, Swing, JavaFX & SWT 4
X Java Komponenten jeder Zeit hinzufügen können AWT, Swing, JavaFX & SWT 3
S View-Komponenten im Controller bekannt machen AWT, Swing, JavaFX & SWT 7
D Grafische Komponenten komplett neu aufbauen (Neukonstruktion) AWT, Swing, JavaFX & SWT 5
A AWT Komponenten in JavaFX einbetten AWT, Swing, JavaFX & SWT 9
M Swing Komponenten erscheinen beim darüberfahren? AWT, Swing, JavaFX & SWT 7
H Komponenten unmittelbar nach dem Ausführen teilweise unsichtbar AWT, Swing, JavaFX & SWT 3
K GUI in Komponenten aufteilen (MVC) AWT, Swing, JavaFX & SWT 2
W Funktionen, sowie aufruf einiger Komponenten AWT, Swing, JavaFX & SWT 4
J Alle Komponenten eines JFrames durchlaufen AWT, Swing, JavaFX & SWT 2
R Swing Komponenten bleiben bei Animation unsichtbar AWT, Swing, JavaFX & SWT 7
T Unter JPanel liegende Komponenten "totschalten" AWT, Swing, JavaFX & SWT 5
morphesus Swing Komponenten werden nicht angezeigt AWT, Swing, JavaFX & SWT 8
C Swing Reihenfolge der Initialisierung von Komponenten AWT, Swing, JavaFX & SWT 6
Asamandra LayoutManager GridBagLayout - Komponenten (mit fill?) vergrößern aber Proportionen dabei erhalten? AWT, Swing, JavaFX & SWT 3
B Swing Komponenten auf JApplet setSize AWT, Swing, JavaFX & SWT 7
B Swing Komponenten auf JApplet setSize AWT, Swing, JavaFX & SWT 2
W Bildgröße automatisch an Komponenten anpassen AWT, Swing, JavaFX & SWT 3
TheWhiteShadow Swing Komponenten organisieren AWT, Swing, JavaFX & SWT 9
S Überlappung zweier Komponenten AWT, Swing, JavaFX & SWT 12
Z größe der komponenten bestimmen AWT, Swing, JavaFX & SWT 16
C GUI-Komponenten skalieren AWT, Swing, JavaFX & SWT 10
M Seltsames Problem mit Resize eines Fensters und seiner Komponenten AWT, Swing, JavaFX & SWT 2
D Swing Komponenten verstecken AWT, Swing, JavaFX & SWT 4
X Swing Resizing der Komponenten innheralb eines Panels AWT, Swing, JavaFX & SWT 2
T Swing Font für alle Komponenten ändern AWT, Swing, JavaFX & SWT 2
S Problem mit Swing Komponenten AWT, Swing, JavaFX & SWT 11
A Swing Alle Komponenten auf JFrame ermitteln AWT, Swing, JavaFX & SWT 4
E LookAndFeel Eigene Komponenten mit Synth L&F stylen AWT, Swing, JavaFX & SWT 2
S Swing Frame und Klasse extends JPanel - Komponenten zur Laufzeit austauschen AWT, Swing, JavaFX & SWT 18
S JButton und textfield.setText - Komponenten über-/verdecken sich AWT, Swing, JavaFX & SWT 15
M Komponenten übereinander prüfen AWT, Swing, JavaFX & SWT 3
W LayoutManager GridBag richtig nutzen - Komponenten richtig anordnen und automatisch vergrößern AWT, Swing, JavaFX & SWT 5
M Komponenten in anderer Reihenfolge anzeigen AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben