Button auf JTabbedPane legen

Shizzl_chrizzl

Erfahrenes Mitglied
mal kurz ne Frage wie kann ich einen JButton auf eine JTabbedPane legen ohne das der Button immer der Größe der JTabbedPane angepasst wird, d.h. er wird immer auf die Länge und Breite der JTabbedPane gezogen und dies möchte ich eben nicht haben weil es hässlich aussieht.

Habe schon versucht es über ein extra JPanel zu lösen hat aber leider auch nicht geklappt.

Ich weis das es eigentlich ne doofe Frage ist, aber ich hab total dickes Brett vorm Kopf ;-).
 
Hi,
es gibt keine doofen Fragen... :p

Also, die Sache ist recht einfach,
1. Swing arbeitet mit LayoutManagern.
2. Beim JTabbedPane gibt es noch eine Besonderheit, denn wenn du dort ein Panel reinlegst, bekommt das immer die Größe des Reiter.

Das ganze ist nicht ganz so einfach, wenn du deine GUI resizeable machst, weil sich dann die Größen immer ändern. Dann solltes du alles mit LayoutManagern machen.

Wenn du jedoch weißt wie groß dein TabbedPane ist, kannst du dort ein Panel reinlegen, was sich ja dann auf die Größe des TabbedPane vergrößert. Aber du kannst dem Panel mit setLayout(null) das Layout entziehen. Wenn du jetzt einen Button erstellst und den mit setBounds(...) dimensionierst und anschließend in das Panel packst, dann sollte es funktionieren.

Einfach mal ausprobieren... ;)
 
Dazu habe ich eine erweiterte Frage. Wie bekomme ich 2 oder mehrer Panels in eine JTabbedPane, die ich über GridBagLayout anordnen kann?
Ich habe versucht, ein GridBagLayout Objekt einzufügen, aber damit ist der Compiler nicht einverstanden.
 
JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.add("Beschriftungsstring", Componente);

Das Problem ist die Componente, weil er nicht alles nimmt :)
Ich möchte gerne das TabbedPane wie eine ContentPane haben, worauf ich Panels kleben kann und diese mit einem LayoutManager verwalten kann. Die Componenten, die er nimmt stehen in dieser Beziehung:
Java ist auch eine Insel – 15.3 Komponenten im AWT und in Swing

Ich kann zwa ein JPanel hinzufügen, aber nicht ein zweites.
Über einen creativen Vorschlag wäre ich dankbar.
 
Hallo Marco,

schau mal hier:

Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.*;

public class TabExample extends JFrame {

	private JTabbedPane tabPane = new JTabbedPane();

	private JPanel tab1 = new JPanel();

	private JPanel tab2 = new JPanel();

	public TabExample() {
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLocationByPlatform(true);
		this.setSize(500, 300);

		tab1.setLayout(new BorderLayout());
		tab1.add(new JColoredPanel(), BorderLayout.CENTER);
		tab1.add(new JColoredPanel(), BorderLayout.NORTH);
		tab1.add(new JColoredPanel(), BorderLayout.EAST);
		tab1.add(new JColoredPanel(), BorderLayout.SOUTH);
		tab1.add(new JColoredPanel(), BorderLayout.WEST);

		tab2.setLayout(new GridLayout(2, 3));
		tab2.add(new JColoredPanel());
		tab2.add(new JColoredPanel());
		tab2.add(new JColoredPanel());
		tab2.add(new JColoredPanel());
		tab2.add(new JColoredPanel());
		tab2.add(new JColoredPanel());

		tabPane.addTab("tab1", tab1);
		tabPane.addTab("tab2", tab2);

		this.add(tabPane);

		this.setVisible(true);
	}

	public static void main(String[] args) {
		new TabExample();
	}

	class JColoredPanel extends JPanel {
		public JColoredPanel() {
			int r = (int) (Math.random() * 3);
			r = r == 0 ? 3 : r;
			System.out.println(r);
			switch (r) {
			case 1:
				this.setBackground(Color.BLUE);
				break;
			case 2:
				this.setBackground(Color.GREEN);
				break;
			case 3:
				this.setBackground(Color.RED);
			}
			this.setBorder(BorderFactory.createEtchedBorder());
		}
	}
}


Vg Erdal
 
OK...auf die Idee, meine Panels in ein gemeinsames Panel einzubetten und dieses dann dem JTabbedPane zu übergeben, darauf bin ich jetzt auch gekommen.
Trotzdem vielen Dank!
 
Zurück