Hallo,
ich habe ein JTabbedPane mit den Reiterlaschen auf der linken Seite.
In einigen Reiterlaschen habe ich ein LabelButton-Element hinzugefügt, mit dem man den entsprechenden Reiter löschen kann. Andere Reiterlaschen sind Standard.
Das Problem ist, daß ich den Inhalt der Reiterlaschen so ausrichten will, daß der Text immer linkbündig ist, aber der Button immer rechtbündig.
Als L&F benutze ich das Standard Ocean.
Dort werden die Inhalte der Reiterlaschen anscheinend immer zentriert.
Weiß irgendjemand wie man die Ausrichtung innerhalb der Reiterlaschen beeinflussen kann?
Auch hätte ich gerne, daß alle Reiterlaschen gleich hoch sind.
Hier mal ein kleines Beispielprogramm:
Wie ihr seht, habe ich schon eine Teillösung gefunden, aber ich finde diese nicht sehr elegant. Da muß es doch noch was besseres geben.
Die einzige Möglichkeit, die mir noch einfällt ist die, daß ich auch für die Standard-Reiterlaschen ein Label-Element mache und deren Größe ermittle. So könnte ich auch die Höhe steuern.
Ich habe auch schon versucht ein bißchen mit dem L&F zu spielen und dort einzelne Methoden zu überschreiben, bisher aber ohne Erfolg.
MfG
hansmueller
ich habe ein JTabbedPane mit den Reiterlaschen auf der linken Seite.
In einigen Reiterlaschen habe ich ein LabelButton-Element hinzugefügt, mit dem man den entsprechenden Reiter löschen kann. Andere Reiterlaschen sind Standard.
Das Problem ist, daß ich den Inhalt der Reiterlaschen so ausrichten will, daß der Text immer linkbündig ist, aber der Button immer rechtbündig.
Als L&F benutze ich das Standard Ocean.
Dort werden die Inhalte der Reiterlaschen anscheinend immer zentriert.
Weiß irgendjemand wie man die Ausrichtung innerhalb der Reiterlaschen beeinflussen kann?
Auch hätte ich gerne, daß alle Reiterlaschen gleich hoch sind.
Hier mal ein kleines Beispielprogramm:
Java:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.ComponentOrientation;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
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.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.metal.MetalTabbedPaneUI;
import javax.swing.JComponent;
public class MainProg
{
JFrame Fenster;
JTabbedPane jtp;
static int x = 0;
static int y = 0;
public static void main(String[] args)
{
MainProg x = new MainProg();
}
public MainProg()
{
Fenster = new JFrame("Versuch Reiter");
Fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jtp = new JTabbedPane(JTabbedPane.LEFT);
//jtp.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
//jtp.applyComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
//jtp.setAlignmentX(JTabbedPane.LEFT_ALIGNMENT);
//jtp.setAlignmentY(JTabbedPane.LEFT_ALIGNMENT);
//jtp.setUI(new AlignedTabbedPaneUI());
jtp.addTab("Reiter 01", new JLabel("Tabinhalt01"));
jtp.setTabComponentAt(0, new yTabKomponenteLabelButton());
jtp.addTab("Reiter 02 Mehr Text", new JLabel("Tabinhalt02"));
jtp.setTabComponentAt(1, new yTabKomponenteLabelButton());
jtp.addTab("Normaler Reiter", new JLabel("Tabinhalt03"));
jtp.addTab("Standard Reiter", new JLabel("Tabinhalt04"));
mGroesseermittelnundsetzen();
Fenster.add(jtp);
Fenster.setSize(600, 600);
Fenster.setVisible(true);
}
public void mGroesseermittelnundsetzen()
{
x = 0;
y = 0;
for(int i = 0, m = jtp.getTabCount(); i < m; i++)
{
Component c = jtp.getTabComponentAt(i);
Dimension d = new Dimension();
if(c != null)
{
//Hier wird die Größe des LabelButton-Elementes ermittelt
d = ((yTabKomponenteLabelButton) c).getLayout().preferredLayoutSize((yTabKomponenteLabelButton) c);
if(x < d.width)
{
x = d.width;
}
if(y < d.height)
{
y = d.height;
}
}
else
{
//Hier wird die größe des Textes ermittelt, den ein normaler Reiter enthält.
//Stimmt leider nicht exakt mit dem dargestellten Text überein.
//Ist notwendig, falls der Text länger als das LabelButton-Element ist.
System.out.println(jtp.getTitleAt(i));
JPanel pndummy = new JPanel(new GridLayout(1, 1, 0, 0));
JLabel dummy = new JLabel(jtp.getTitleAt(i));
pndummy.add(dummy);
d = pndummy.getLayout().preferredLayoutSize(pndummy);
if(x < d.width)
{
x = d.width;
}
if(y < d.height)
{
y = d.height;
}
}
}
//Jetzt werden noch allen LabelButton-Elementen die oben ermittelte Größe zugewiesen.
for(int i = 0, m = jtp.getTabCount(); i < m; i++)
{
Component c = jtp.getTabComponentAt(i);
if(c != null)
{
((yTabKomponenteLabelButton) c).setPreferredSize(new Dimension(x, y));
}
}
}
class yTabKomponenteLabelButton extends JPanel
{
TabJButton btn;
JLabel lb;
public yTabKomponenteLabelButton()
{
// super.setLayout(new GridLayout(1,1));//(FlowLayout.LEFT, 0, 0));
GridBagLayout gbl = new GridBagLayout();
this.setLayout(gbl);
this.setOpaque(false);//true);
lb = new JLabel()
{
public String getText()
{
int i = jtp
.indexOfTabComponent(yTabKomponenteLabelButton.this);
if (i != -1)
{
return jtp.getTitleAt(i);
}
return null;
}
};
// JPanel pn = new JPanel(new BorderLayout(0, 0));
// pn.add(lb, BorderLayout.WEST);
btn = new TabJButton();
// pn.add(btn, BorderLayout.EAST);
// this.add(pn);
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = Integer.MAX_VALUE;
gbc.weighty = 0;
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(0, 0, 0, 0);
gbl.setConstraints(lb, gbc);
this.add(lb);
gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 0;
gbc.gridwidth = 1;
gbc.gridheight = 1;
gbc.weightx = Integer.MAX_VALUE;
gbc.weighty = 0;
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.EAST;
gbc.insets = new Insets(0, 0, 0, 0);
gbl.setConstraints(btn, gbc);
this.add(btn);
}
class TabJButton extends JButton implements ActionListener
{
public TabJButton()
{
this.setText("Löschen");
this.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e)
{
int i = jtp.indexOfTabComponent(yTabKomponenteLabelButton.this);
if (i != -1)
{
jtp.removeTabAt(i);
mGroesseermittelnundsetzen();
}
}
}
}
}
Wie ihr seht, habe ich schon eine Teillösung gefunden, aber ich finde diese nicht sehr elegant. Da muß es doch noch was besseres geben.
Die einzige Möglichkeit, die mir noch einfällt ist die, daß ich auch für die Standard-Reiterlaschen ein Label-Element mache und deren Größe ermittle. So könnte ich auch die Höhe steuern.
Ich habe auch schon versucht ein bißchen mit dem L&F zu spielen und dort einzelne Methoden zu überschreiben, bisher aber ohne Erfolg.
MfG
hansmueller