GroupLayout

sh

Aktives Mitglied
Hallo,
ich hatte vor kurzem ein Problem mit GroupLayout() im Topic (JAVA-FORUM) GroupLayout() - wie funktioniert's?, habs mittlerweile auch so halbwegs verstanden wie das Ganze funktioniert aber Häng nun doch wieder fest mit folgendem Code:
Java:
import java.awt.Dimension;
import java.awt.EventQueue;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.WindowConstants;

 
@SuppressWarnings("serial")
public class Test extends JFrame {
 
	public Test() {
	    	createMainGUI();
	    	
	        setMinimumSize(new Dimension(340, 300));
	        setPreferredSize(new Dimension(740, 480));
	        setTitle("Test GUI");
	        pack();
	        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	        setLocationRelativeTo(null);
	}
	
	private void createMainGUI() {
		GroupLayout layout = new GroupLayout(getContentPane());
		getContentPane().setLayout(layout);
		layout.setAutoCreateGaps(true);
		layout.setAutoCreateContainerGaps(true);
		
		JLabel artistLabel = new JLabel("Artist:"), titleLabel = new JLabel("Title:");
		
		JTextField artistTextField = new JTextField(), titleTextField = new JTextField();
	
		JButton swapButton = new JButton("Swap");
		
		layout.setHorizontalGroup(layout.createSequentialGroup()
				.addGroup(layout.createParallelGroup(Alignment.LEADING)
						.addComponent(artistLabel)
						.addComponent(titleLabel)
				)
				.addGroup(layout.createParallelGroup(Alignment.LEADING)
						.addComponent(artistTextField)
						.addComponent(titleTextField)
				)
				.addComponent(swapButton)
		);
	
		layout.setVerticalGroup(layout.createSequentialGroup()
				.addGroup(layout.createParallelGroup(Alignment.BASELINE)
						.addComponent(artistLabel)
						.addComponent(artistTextField)
				)
				.addGroup(layout.createParallelGroup(Alignment.BASELINE)
						.addComponent(titleLabel)
						.addComponent(titleTextField)
						
				)
				.addComponent(swapButton)
		);
	}
	
    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                new Test().setVisible(true);
            }
        });
    }
	
}
Das Produziert eine GUI wie im Anhang test-1.png.



Wenn ich den Code von layout.setVerticalGroup(layout.createSequentialGroup() auf:
Java:
		layout.setVerticalGroup(layout.createSequentialGroup()
				.addGroup(layout.createParallelGroup(Alignment.BASELINE)
						.addComponent(artistLabel)
						.addComponent(artistTextField)
						.addComponent(swapButton)
				)
				.addGroup(layout.createParallelGroup(Alignment.BASELINE)
						.addComponent(titleLabel)
						.addComponent(titleTextField)
						.addComponent(swapButton)
				)
		);
änder dann liegt der Button zumindest schonmal Vertikal-parallel zu dem Rest vom Formular (siehe test-2.png im Anhang).

Allerdings will ich auch das er die Höhe von beiden JTextFields zusammen (mit der Gap dazwischen) hat, also wie im ziel.png (Anhang).

Irgendwelche Ideen wie ich das umsetzen kann? Und ja, ich will es mit GroupLayout() machen und nicht mit BorderLayout() und anderen ;-)

MfG
 
Zuletzt bearbeitet:
Genau wie beim Letzten Beispiel, von oben nach unten die Komponenten durchgehen:
Java:
  |
  v 
     _
A   |
B   |_

(Das soll ein großes C sein 😀)

Java:
Wenn du hier oben anfängst, stößt du zuerst auf ein A und ein C, die sich eine Zeile Teilen.
-> ParallelGroup
         Nach dem A kommt noch ein B 
         -> SequentialGroup
                     >A
                     >B
         Das C ganz normal
         -> C
 
Zuletzt bearbeitet:
Danke für deine Hilfe bERt0,

allerdings krieg ichs auch mit deiner Anleitung noch nicht gebacken.
Im Anhang mal das Ergebnis, hier nochmal der Code für die Horizontale sowie Vertikale:
Java:
		layout.setHorizontalGroup(layout.createSequentialGroup()
				.addGroup(layout.createParallelGroup(Alignment.LEADING)
						.addComponent(artistLabel)
						.addComponent(titleLabel)
				)
				.addGroup(layout.createParallelGroup(Alignment.LEADING)
						.addComponent(artistTextField)
						.addComponent(titleTextField)
				)
				.addComponent(swapButton)
		);
	
		layout.setVerticalGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addGroup(layout.createSequentialGroup()
						.addComponent(artistLabel)
						.addComponent(titleLabel)
				)
				.addGroup(layout.createSequentialGroup()
						.addComponent(artistTextField)
						.addComponent(titleTextField)
				)
				.addComponent(swapButton)
		);

Irgendwie scheint in layout.setVerticalGroup(layout.createParallelGroup(Alignment.BASELINE) das Alignment.BASELINE keine Wirkung zu haben.

Was mach ich falsch?

MfG
 
Ok, da wirds ein bisschen trickreich - und du musst mit Gaps und den Size Angaben umgehen können. Da ich mal wieder keinen Schlaf kriege, hier bitte:

Java:
GroupLayout gl_contentPane = new GroupLayout(contentPane);
		gl_contentPane.setAutoCreateGaps(true);
		gl_contentPane.setHorizontalGroup(
			gl_contentPane.createSequentialGroup()
				.addGroup(gl_contentPane.createSequentialGroup()
						.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
								.addComponent(label1).addComponent(label2)
								)
						.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
								.addComponent(textField1).addComponent(textField2)
								)
						)
				.addComponent(btnNewButton)
				);
				
				
				
				
		gl_contentPane.setVerticalGroup(
				gl_contentPane.createSequentialGroup()
				.addGroup(
						gl_contentPane.createParallelGroup(Alignment.LEADING)
						.addGroup(gl_contentPane.createSequentialGroup()
								.addGroup(gl_contentPane.createParallelGroup()
										.addComponent(label1).addComponent(textField1,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE,GroupLayout.PREFERRED_SIZE)
										)
								.addGroup(gl_contentPane.createParallelGroup()
										.addComponent(label2)
										.addComponent(textField2,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE,GroupLayout.PREFERRED_SIZE)
										)
								)
						.addComponent(btnNewButton,GroupLayout.DEFAULT_SIZE,GroupLayout.PREFERRED_SIZE,Short.MAX_VALUE)
						)
				.addGap(0, Short.MAX_VALUE, Short.MAX_VALUE)
				);
Wenn du was nicht verstehst frag.
 
Zuletzt bearbeitet:

Zurück
Oben