LayoutManager JSeparator in FlowLayout

reason4u2

Mitglied
Hi,

ich hab ein Problem mit dem JSeparator in einem FlowLayout und nach langer Suche und Rumprobieren keine Lösung gefunden :/

Also, ich habe ein BorderLayout, im Center befindet sich ein CardLayout(unwichtig) und im Süden ein FlowLayout(.RIGHT) mit 2 Buttons zum switchen der Cards, jetzt wollte ich einfach eine Trennlinie zwichen den Layouts haben, und zwar am oberen Rand des FlowLayout, über den Buttons.

Leider setzt sich der Separator immer nur vor die Buttons und ist nicht sichtbar, hab schon alles probiert, setVisible und die breite geändert, das FlowLayout ausgetauscht, aber nichts geht :-(

Hier noch das Bild vom unterem Bereich, ich denke ihr wisst wo ich gern die Linie hätte ?
 

Anhänge

  • JSeparator.PNG
    JSeparator.PNG
    9,7 KB · Aufrufe: 42
Wenn sich der JSeparator vor die Buttons setzt, solltest du den LayoutManager wechseln bzw. noch ein weiteres BorderLayout einschachteln.

Aber vorher kannst du mal noch so ins Blaue probieren:
Java:
seprarator.setPreferredSize(new Dimension(this.getWidth(), separator.getPreferredSize());
Setzt dem JSeparator neue Dimensionen (vermutlich, hat er keine, oder zu geringe Dimensionen).
Code:
this
ist in dieser Anweisung das einbettende JPanel. Sollte
Code:
getPreferredSize()
nichts bringen, kannst du da auch mal eine 2 oder 3 probieren.

Es kann aber auch sein, dass du erst den Sepataror in die GUI einbaust, wenn sie schon sichtbar ist.
Dann muss danach ein
Code:
validate();
folgen, damit er in die Berechnungen des LayoutManagers einbezogen wird.
Am Besten ist immer, wenn die GUI erst sichtbar gemacht wird, wenn alle Komponenten hinzugefügt wurden.
 
Das hatte ich auch schon Versucht, aber es geht trozdem nicht, und frame.setVisible(true) setzt ich immer erst nachdem alles geladen ist. Ich weiß jetzt nicht wie du das mit dem BorderLayout meinst, hier mal der Code:

Java:
imports*

public class ServerFrame {

	private JFrame frame;
	
	private int currentCard;
	private JPanel cardPanel;
	private CardLayout cardLayout;
	
	private StartPanel startPanel;
	private JButton btnZurck;
	private JButton btnWeiter;
	private JSeparator separator;

	public ServerFrame() {
		initialize();
	}

	private void initialize() {
		frame = new JFrame();
		frame.setResizable(false);
		frame.setSize(550, 350);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(new BorderLayout(0, 0));
		
		JPanel buttonPanel = new JPanel();
		buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT, 5, 5));
		
		separator = new JSeparator();
		separator.setOrientation(SwingConstants.VERTICAL);
                //separator.setPreferredSize(new Dimension(buttonPanel.getWidth(), 3); hilft leider nicht
		buttonPanel.add(separator);
		
		btnZurck = new JButton("Zur\u00FCck");
		btnZurck.setEnabled(false);
		buttonPanel.add(btnZurck);
		
		btnWeiter = new JButton("Weiter");
		btnWeiter.setEnabled(false);
		buttonPanel.add(btnWeiter);
		
		startPanel = new StartPanel();
		
		currentCard = 1;
		cardPanel = new JPanel();
		cardPanel.setLayout(cardLayout = new CardLayout(5, 5));
		cardPanel.add(startPanel);
		
		frame.getContentPane().add(buttonPanel, BorderLayout.SOUTH);
		frame.getContentPane().add(cardPanel, BorderLayout.CENTER);
	}
	
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
					ServerFrame window = new ServerFrame();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
}
 
In deinem Code wird der JSeparator vertikal ausgerichtet (von oben nach unten).

Ich hatte mir das so gedacht:
Java:
import java.awt.*;
import javax.swing.*;
 
public class ServerFrame {
 
    private JFrame frame;
    
    private int currentCard;
    private JPanel cardPanel;
    private CardLayout cardLayout;
    
    private StartPanel startPanel;
    private JButton btnZurck;
    private JButton btnWeiter;
 
    public ServerFrame() {
        initialize();
    }
 
    private void initialize() {
        frame = new JFrame("ServerFrame");
        frame.setResizable(false);
        frame.setSize(550, 350);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 5));
        
        btnZurck = new JButton("Zur\u00FCck");
        btnZurck.setEnabled(false);
        buttonPanel.add(btnZurck);
        
        btnWeiter = new JButton("Weiter");
        btnWeiter.setEnabled(false);
        buttonPanel.add(btnWeiter);
        
        startPanel = new StartPanel();
        
        currentCard = 1;
        cardPanel = new JPanel(new CardLayout(5, 5));
        cardPanel.add(startPanel);
        
        JPanel helperPanel = new JPanel(new BorderLayout());
        helperPanel.add(new JSeparator(SwingConstants.HORIZONTAL), BorderLayout.NORTH);
        helperPanel.add(buttonPanel, BorderLayout.SOUTH);
        
        frame.add(helperPanel, BorderLayout.SOUTH);
        frame.add(cardPanel, BorderLayout.CENTER);
        
        frame.setVisible(true);        
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    ServerFrame window = new ServerFrame();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

Sieht bei mir so aus:
 

Anhänge

  • JSeparator.png
    JSeparator.png
    5,7 KB · Aufrufe: 49

Zurück
Oben