Swing Problem mit JTabbedPane

hdi

Top Contributor
Hey, folgendes KSKB:

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;

@SuppressWarnings("serial")
public class KSKB extends JFrame {

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				new KSKB().setVisible(true);
			}
		});
	}

	KSKB() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		final JTabbedPane tabs = new JTabbedPane();
		tabs.addTab("Tab", createTabComponent());

		JButton btn = new JButton("Add Tab");
		btn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				tabs.addTab("New Tab", createTabComponent());
			}
		});

		JPanel panel = new JPanel();
		panel.setBackground(Color.BLUE);
		panel.setPreferredSize(new Dimension(500, 300));

		setLayout(new BorderLayout());
		add(btn, BorderLayout.NORTH);
		add(panel, BorderLayout.CENTER);
		add(tabs, BorderLayout.SOUTH);
		pack();
	}

	static JComponent createTabComponent() {
		JButton btn = new JButton("Button");
		// Mit der Größe der Komponente des Tabs hat das scheinbar nix zu tun:
		// btn.setPreferredSize(new Dimension(0, 100));
		return btn;
	}
}

Frage: Warum wächst das TabbedPane mit jedem neuen Tab in die CENTER-Komponente rein? Alle Tab-Komponenten sind doch gleich groß, es gibt keinen Grund dafür dass das TabbedPane höher werden muss.

Ich vermute das hat was mit dem Layout zu tun*, d.h. BorderLayout.SOUTH. Ich werd's gleich noch mit nem GridBagLayout versuchen, aber trotzdem ist das an sich ja schon mal irgendwie komisch... Wie kommt die TabbedPane denn darauf dass sie jetzt auf einmal höher sein müsste?

*update: Nein, hat es scheinbar nicht.

Danke
 
Zuletzt bearbeitet:
Also mit GBL ist es das selbe:

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;

@SuppressWarnings("serial")
public class KSKB extends JFrame {

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				new KSKB().setVisible(true);
			}
		});
	}

	KSKB() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		final JTabbedPane tabs = new JTabbedPane();
		tabs.addTab("Tab", createTabComponent());

		JButton btn = new JButton("Add Tab");
		btn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				tabs.addTab("New Tab", createTabComponent());
			}
		});

		JPanel panel = new JPanel();
		panel.setBackground(Color.BLUE);
		panel.setPreferredSize(new Dimension(500, 300));

		setLayout(new GridBagLayout());
		GridBagConstraints c = new GridBagConstraints();
		c.gridy = 0;
		c.fill = GridBagConstraints.HORIZONTAL;
		add(btn, c);
		c.gridy = 1;
		c.fill = GridBagConstraints.BOTH;
		c.weightx = 1;
		c.weighty = 1;
		add(panel, c);
		c.gridy = 2;
		c.weightx = 0;
		c.weighty = 0;
		c.fill = GridBagConstraints.HORIZONTAL;
		add(tabs, c);
		pack();
	}

	static JComponent createTabComponent() {
		JButton btn = new JButton("Button");
		// Mit der Größe der Komponente des Tabs hat das scheinbar nix zu tun:
		// btn.setPreferredSize(new Dimension(0, 100));
		return btn;
	}
}
 
Keine Ahnung, warum das jetzt so reagiert, aber wenn du deinem JTabbedPane mit setPreferredSize eine Grösse zuweist, dann bleibt diese Grösse gleich.
 

Zurück
Oben