Spaltenorientierte Komponente, ähnlich JTabbed gesucht

Status
Nicht offen für weitere Antworten.
C

comci

Gast
Hallo,

nach langem passivem lesen, hätte ich jetzt auch mal wieder eine Frage. Ich bin auf der Suche nach einer passenden Swing Komponente, und zwar etwas in der Art:

(links zugeklappt / rechts aufgeklappt)
klappdinger.jpg


Nicht so aufwendig wie im Photoshop, aber eben so, dass man eine Reihe von Components hinzufügen kann. Wobei jede eine Überschrift erhält und wenn man auf die Überschrift Klickt wird die Component ausgeblendet. Ich hoffe das ist verständlich.

Gefunden habe ich leider nichts passenden, was eventuell daran liegen könnten, dass ich nicht weiß wie so eine Komponente heißen könnte. ???:L

Ich hab mir dann gedacht so schwierig kann das doch nicht sein :idea:, nur leider ist es das wohl schon. Und eigentlich wollte ich keinen eigenen LayoutManager schreiben, das muss doch auch einfacher gehen, oder? :?:

Hier meine (nicht funktionierende) Idee:

Code:
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.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.JToggleButton;
import javax.swing.border.BevelBorder;


public class JFoldingSidebar extends JPanel {

	public JFoldingSidebar() {
		setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
	}

	public JComponent add(JComponent comp, String heading) {

		addImpl(packComponent(comp, heading), null, -1);
		return comp;
	}

	public JComponent add(JComponent comp, String heading, int index) {

		addImpl(packComponent(comp, heading), null, index);
		return comp;
	}

	private JComponent packComponent(JComponent comp, String heading) {

		final JScrollPane scroll = new JScrollPane();
		scroll.setViewportView(comp);

		final JPanel box = new JPanel(new BorderLayout());

		final JToggleButton head = new JToggleButton(heading);
		head.setOpaque(true);
		head.setBackground(Color.LIGHT_GRAY);
		head.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
		head.setPreferredSize(new Dimension(head.getPreferredSize().width,26));
		head.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {

				//scroll.setVisible(!scroll.isVisible());
				if (box.getComponentCount() == 2)
					box.remove(scroll);
				else
					box.add(scroll, BorderLayout.CENTER);
				JFoldingSidebar.this.revalidate();
			}
		});



		box.add(head, BorderLayout.NORTH);
		box.add(scroll, BorderLayout.CENTER);

		return box;
	}


	public static void main(String[] args) {

		JFrame frame = new JFrame();

		JFoldingSidebar folding = new JFoldingSidebar();
		folding.add(new JSlider(), "Filter1");
		folding.add(new JSlider(), "Filter2");
		JPanel larger = new JPanel();
		larger.add(new JLabel("hello world"));
		larger.add(new JLabel("hello world 2"));
		folding.add(larger, "Filter3");

		frame.getContentPane().setLayout(new BorderLayout());
		frame.getContentPane().add(folding, BorderLayout.EAST);

		frame.pack();
		frame.setVisible(true);
	}

}

Bin für jede Hilfe / Anregung dankbar.

Grüße,
Sebastian
 

Ariol

Top Contributor
Hab mal schnell was gebaut:
Code:
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

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


public class JFloatingTabbedPane extends JTabbedPane
{
	
	private int lastIndex = 0;
	private boolean extended = true;
	
	public JFloatingTabbedPane()
	{
		super();
		init();
	}
	
	public JFloatingTabbedPane(int tabPlacement)
	{
		super(tabPlacement);
		init();
	}
	
	public JFloatingTabbedPane(int tabPlacement, int tabLayoutPolicy)
	{
		super(tabPlacement,tabLayoutPolicy);
		init();
	}

	private void init()
	{
		addMouseListener(new MouseAdapter()
		{
			@Override
			public void mouseClicked(MouseEvent e)
			{
				super.mouseClicked(e);
								
				if(getSelectedIndex() == lastIndex && e.getClickCount() >= 2)
				{
					setExtensionState(!extended);
				}
				lastIndex = getSelectedIndex();
			}
		});
		
		addComponentListener(new ComponentAdapter()
		{
			@Override
			public void componentResized(ComponentEvent e)
			{
				// TODO Auto-generated method stub
				super.componentResized(e);
				setExtensionState(extended);
			}
		});
	}
	
	@Override
	public void add(Component component, Object constraints, int index)
	{
		// TODO Auto-generated method stub
		super.add(component, constraints, index);
		setExtensionState(extended);
	}
	
	private void setExtensionState(boolean extended)
	{
		int rows = getUI().getTabRunCount(this);
		Rectangle tabBounds  = getUI().getTabBounds(this, getSelectedIndex());
		
		Dimension compDimension = new Dimension(0,0);
		
		compDimension = getSelectedComponent().getPreferredSize();

		int width = getWidth();
		int height = tabBounds.height*rows;
			
		if(extended)height += compDimension.height;
		
		setBounds(getX(),getY(),width,height);
		setPreferredSize(new Dimension(width,height));
		this.extended = extended;
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		JFrame test = new JFrame();
		JFloatingTabbedPane jtp = new JFloatingTabbedPane();
		
		JPanel p1 = new JPanel();
		p1.setBackground(Color.red);
		p1.setPreferredSize(new Dimension(100,100));
		
		jtp.add("TEST1", new JPanel());
		jtp.add("TEST2", p1);
		jtp.add("Lala", new JButton("TEST"));
		test.add(jtp);
		test.pack();
		test.setVisible(true);
		test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}

}

Ist nicht besonderst sauber, funzt aber fürs erste.
Du musst allerdings jeder Componente eine PreferredSize mitgeben. (Zumindest die Höhe)

EDIT 21:03
 
C

comci

Gast
Danke für den Code, dass ist aber nicht dass, was ich mir vorgestellt habe. Es geht nicht darum einzelne Tabs zu "schließen", sondern ich will beliebige Components untereinander anordnen, wobei sich die gerade sichtbaren Components den verfügbaren Raum teilen.
Um bei dem Bild aus dem Ursprungsposting zu bleiben geht es darum wo die Tabs drin sind, nicht um die Tabs selber. Ich hoffe das ist irgendwie klarer jetzt. :autsch:


Ariol hat gesagt.:
Hab mal schnell was gebaut:
Code:
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

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


public class JFloatingTabbedPane extends JTabbedPane
{
	
	private int lastIndex = 0;
	private boolean extended = true;
	
	public JFloatingTabbedPane()
	{
		super();
		init();
	}
	
	public JFloatingTabbedPane(int tabPlacement)
	{
		super(tabPlacement);
		init();
	}
	
	public JFloatingTabbedPane(int tabPlacement, int tabLayoutPolicy)
	{
		super(tabPlacement,tabLayoutPolicy);
		init();
	}

	private void init()
	{
		addMouseListener(new MouseAdapter()
		{
			@Override
			public void mouseClicked(MouseEvent e)
			{
				super.mouseClicked(e);
								
				if(getSelectedIndex() == lastIndex && e.getClickCount() >= 2)
				{
					setExtensionState(!extended);
				}
				lastIndex = getSelectedIndex();
			}
		});
		
		addComponentListener(new ComponentAdapter()
		{
			@Override
			public void componentResized(ComponentEvent e)
			{
				// TODO Auto-generated method stub
				super.componentResized(e);
				setExtensionState(extended);
			}
		});
	}
	
	@Override
	public void add(Component component, Object constraints, int index)
	{
		// TODO Auto-generated method stub
		super.add(component, constraints, index);
		setExtensionState(extended);
	}
	
	private void setExtensionState(boolean extended)
	{
		int rows = getUI().getTabRunCount(this);
		Rectangle tabBounds  = getUI().getTabBounds(this, getSelectedIndex());
		
		Dimension compDimension = new Dimension(0,0);
		
		compDimension = getSelectedComponent().getPreferredSize();

		int width = getWidth();
		int height = tabBounds.height*rows;
			
		if(extended)height += compDimension.height;
		
		setBounds(getX(),getY(),width,height);
		setPreferredSize(new Dimension(width,height));
		this.extended = extended;
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		JFrame test = new JFrame();
		JFloatingTabbedPane jtp = new JFloatingTabbedPane();
		
		JPanel p1 = new JPanel();
		p1.setBackground(Color.red);
		p1.setPreferredSize(new Dimension(100,100));
		
		jtp.add("TEST1", new JPanel());
		jtp.add("TEST2", p1);
		jtp.add("Lala", new JButton("TEST"));
		test.add(jtp);
		test.pack();
		test.setVisible(true);
		test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
	}

}

Ist nicht besonderst sauber, funzt aber fürs erste.
Du musst allerdings jeder Componente eine PreferredSize mitgeben. (Zumindest die Höhe)

EDIT 21:03
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Maxim6394 JavaFX Scene Builder - Crash bei eigener Komponente AWT, Swing, JavaFX & SWT 2
H JDialog in Größe ändern - Resize-Cursor bleibt betreten der Komponente AWT, Swing, JavaFX & SWT 1
temi JavaFX "Frames" in JavaFx - passende Komponente? AWT, Swing, JavaFX & SWT 13
J Swing Komponente wird unpassend angepasst in der Größe AWT, Swing, JavaFX & SWT 35
M4cM4rco0707 JavaFX Custom-Komponente mit Custom-Controller AWT, Swing, JavaFX & SWT 3
J Komponente wird manchmal falsch gezeichnet AWT, Swing, JavaFX & SWT 0
R Swing Komponente im JFrame überschreinen sich AWT, Swing, JavaFX & SWT 7
Q-bert Dynamische Komponente erzeugen AWT, Swing, JavaFX & SWT 6
G vorgefertigte Buttons oder neue Komponente mit MouseListener? AWT, Swing, JavaFX & SWT 0
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
Tom299 JavaFX Ähnliche Komponente wie der VB6 Frame? AWT, Swing, JavaFX & SWT 2
M JavaFX Progressbar bar und track Komponente zur Laufzeit ändern AWT, Swing, JavaFX & SWT 2
Tort-E JavaFX Daten an WebView Komponente AWT, Swing, JavaFX & SWT 1
G JPanel komponente Löschen AWT, Swing, JavaFX & SWT 7
T Swing Index für Komponente in JPanel? AWT, Swing, JavaFX & SWT 6
T Swing Größe einer Komponente in einem BoxLayout / FlowLayout festlegen AWT, Swing, JavaFX & SWT 7
G Border der Komponente bei Table CellRenderer überschreiben AWT, Swing, JavaFX & SWT 0
P Warten auf komponente AWT, Swing, JavaFX & SWT 2
U LookAndFeel für eine Komponente AWT, Swing, JavaFX & SWT 2
E Mit Netbeans von einer Form auf eine Komponente einer anderen Form zugreifen AWT, Swing, JavaFX & SWT 2
G Zeichnen auf eine schwergewichtige Komponente? AWT, Swing, JavaFX & SWT 0
T Komponente wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
S Swing Komponente wird überblendet AWT, Swing, JavaFX & SWT 27
A Swing Komponente mehrseitig ausdrucken AWT, Swing, JavaFX & SWT 2
V Fertige Komponente zum Anzeigen mehrerer Bilder AWT, Swing, JavaFX & SWT 5
B Swing Komponente an Position eines Objektes ausgeben lassen AWT, Swing, JavaFX & SWT 3
R Swing Komponente austauschen AWT, Swing, JavaFX & SWT 2
M JApplet mit Java 3D Komponente AWT, Swing, JavaFX & SWT 6
M Swing JMenu verdeckt durch Komponente (aber kein AWT und Swing mix!?) AWT, Swing, JavaFX & SWT 3
N Swing Java Komponente zur Darstellung von klickbaren Links, die Java Funktionen ausführen können AWT, Swing, JavaFX & SWT 2
S Swing Eigene Komponente (JPanel) soll ChangeEvents verteilen AWT, Swing, JavaFX & SWT 12
S Spezielle komponente aktualisieren AWT, Swing, JavaFX & SWT 9
GUI-Programmer LayoutManager Kurze Layout Frage - eine komponente mittig? AWT, Swing, JavaFX & SWT 5
1 Swing Spaltenbreite and CellEditor- Komponente anpassen AWT, Swing, JavaFX & SWT 4
R Komponente wieder entfernen AWT, Swing, JavaFX & SWT 13
B Komponente "sauber" entfernen(JToolBar) AWT, Swing, JavaFX & SWT 4
xehpuk Swing Komponente in Graustufen zeichnen AWT, Swing, JavaFX & SWT 2
A Swing GlassPane Cursor wird bei fremder Komponente nicht angezeigt AWT, Swing, JavaFX & SWT 3
darekkay Swing Komponente zur Laufzeit neuinitialisieren AWT, Swing, JavaFX & SWT 6
K Swing Komponente als Bild speichern AWT, Swing, JavaFX & SWT 11
F visuelle Komponente AWT, Swing, JavaFX & SWT 3
padde479 Komponente gesucht AWT, Swing, JavaFX & SWT 2
A Swing Komponente für Swing und JSF durch MVC AWT, Swing, JavaFX & SWT 5
P Swing Eigene Komponente Entwickeln - erben von JComponent oder JPanel? AWT, Swing, JavaFX & SWT 5
A Swing suche OpenSource Date(Time)Picker Komponente AWT, Swing, JavaFX & SWT 9
N Swing außerhalb des Hauptframe Komponente/Frame öffnen AWT, Swing, JavaFX & SWT 2
S Feste Position einer Komponente auf Glasspane AWT, Swing, JavaFX & SWT 6
B Erfragen der Komponente AWT, Swing, JavaFX & SWT 4
M Mausklick an darunterliegende Komponente weiterleiten AWT, Swing, JavaFX & SWT 9
B (Swing) Welche Komponente für unterteilten Text? AWT, Swing, JavaFX & SWT 4
D Wie nennt sich beschriebene Komponente? (-> Autocomplete) AWT, Swing, JavaFX & SWT 5
D Komponente im FlowLayout nicht mittig sondern rechts. Wie? AWT, Swing, JavaFX & SWT 4
G Swing Komponente gesucht (Textfeld mit Liste) AWT, Swing, JavaFX & SWT 2
padde479 Suche eine Komponente (->ToolBar) AWT, Swing, JavaFX & SWT 7
algorismi Browser Komponente AWT, Swing, JavaFX & SWT 3
G Swing Auswahlrechteck über Komponente zeichnen AWT, Swing, JavaFX & SWT 3
0 Swing Drag n' Drop Bug wenn Source und Target gleiche Komponente? AWT, Swing, JavaFX & SWT 4
C Swing Komponente mit setLocation auf JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 3
G Gibt es diese Komponente? AWT, Swing, JavaFX & SWT 11
slawaweis Suche TagCloud Komponente für Swing AWT, Swing, JavaFX & SWT 10
H Swing Eigene Komponente wird nur halb oder komisch angezeigt AWT, Swing, JavaFX & SWT 3
M Combobox soll Farbe einer Komponente setzen AWT, Swing, JavaFX & SWT 2
H Swing Eigene Komponente reagiert falsch auf mouseClicked() AWT, Swing, JavaFX & SWT 5
D swt komponente in swing-frame AWT, Swing, JavaFX & SWT 4
hdi SWT Operation auf GUI-Komponente kommt mal wieder nicht an... AWT, Swing, JavaFX & SWT 9
N Suche nach Komponente / LaF AWT, Swing, JavaFX & SWT 21
A Komponente zur Laufzeit hinzufügen und RICHTIG anzeigen AWT, Swing, JavaFX & SWT 3
T Swing Gibt es eine Komponente für eine farbliche Editorbox? AWT, Swing, JavaFX & SWT 6
S Swing Komponente mit jogl AWT, Swing, JavaFX & SWT 18
Airwolf89 Swing Von anderer Klasse auf Eigenschaften einer Komponente zugreifen AWT, Swing, JavaFX & SWT 5
SuperSeppel13 Komponente transparent übermalen AWT, Swing, JavaFX & SWT 2
I Swing Warten, bis eine GUI-Komponente aktualisiert ist? AWT, Swing, JavaFX & SWT 4
R Lineal an einer Komponente AWT, Swing, JavaFX & SWT 10
R KeyListener - welcher Komponente hinzufügen AWT, Swing, JavaFX & SWT 5
Ham Swing PropertyChangeListener aufrufende Komponente AWT, Swing, JavaFX & SWT 5
hdi LayoutManager GridBagLayout : Komponente hat falsche Größe? AWT, Swing, JavaFX & SWT 2
hdi Swing Suche passende API Klasse(n) für meine Komponente AWT, Swing, JavaFX & SWT 8
Ä Graphics-Komponente auf JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 4
H Name einer Komponente ermitteln AWT, Swing, JavaFX & SWT 5
Developer_X Swing Problem beim "rezeichnen" -> Überzeichnen der Komponente AWT, Swing, JavaFX & SWT 8
M Suche Java Komponente AWT, Swing, JavaFX & SWT 2
D Swing Eigene Komponente mit JSpinner AWT, Swing, JavaFX & SWT 4
B Swing setDefaultButton geht nicht - Komponente fängt Events ab AWT, Swing, JavaFX & SWT 5
A Suche TreeTable-Komponente AWT, Swing, JavaFX & SWT 12
GilbertGrape ActionListener implementieren oder Eigenen für jede Komponente? AWT, Swing, JavaFX & SWT 9
V Suche Komponente AWT, Swing, JavaFX & SWT 2
G Komponente zur Laufzeit tauschen. AWT, Swing, JavaFX & SWT 5
G Coverflow -artige Komponente für Swing? AWT, Swing, JavaFX & SWT 2
F eigene Swing-Komponente. Drehregler AWT, Swing, JavaFX & SWT 4
Landei Welche Kalender-Komponente? AWT, Swing, JavaFX & SWT 3
G Komponente in der der Cursor steht zurückgeben? AWT, Swing, JavaFX & SWT 2
P Unsichtbare Komponente in ein Bild rendern? AWT, Swing, JavaFX & SWT 11
G Komponente die im Center und North Bereich liegt zurückgebe? AWT, Swing, JavaFX & SWT 6
O Zwei Listener auf Komponente, warten auf Beendigun? AWT, Swing, JavaFX & SWT 2
G Kennt jemand diese Komponente? AWT, Swing, JavaFX & SWT 2
G Palette Komponente für Swing? AWT, Swing, JavaFX & SWT 8
M Name der Komponente? AWT, Swing, JavaFX & SWT 2
G Komponente oben positionieren (BorderLayout) AWT, Swing, JavaFX & SWT 3
ChaosNo1 Problem mit Komponente auf JPanel adden (beides abgeleitet) AWT, Swing, JavaFX & SWT 4
G Am Ende einer Tabellenzeile zu definierter Komponente gehen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben