# Labels in Box linksbündig ausrichten



## Landei (29. Jun 2005)

Hiho,

ich habe ein kleines nerviges Problem. Schreibe ich etwas wie:


```
Box box = Box.createVerticalBox();
box.add(new JLabel("Das sieht")); 
box.add(new JTextField());
box.add(new JLabel("einfach")); 
box.add(new JTextField());
box.add(new JLabel("blöd aus"));
```

sind alle Komponenten ordentlich links ausgerichtet, nur die blöden JLabels nicht. Ich würde Box gern öfter verwenden, ist ja praktischer als ein JPanel mit LayoutManager usw., aber ich finde einfach keinen einfachen Weg, die Labels linksbündig zu bekommen. Kann doch nicht so schwer sein...

Ciao!
Landei

[/code]


----------



## mic_checker (29. Jun 2005)

kannst du nicht die ausrichtung der jlabels im konstruktor angeben und halt auf LEFT setzen so wie du willst...?


----------



## Landei (29. Jun 2005)

Wenn ich eine Border um das Label zeichne, sieht man, dass der Text INNERHALB des Labels ganz links steht. Das gesamte Label hat einen gewissen Abstand zum linken Box-Rand. Habe schon in allen Varianten probiert:
- setHorizontalAlignment
- setAlignmentX
- setMaximumSize
- setPreferredSize
...

 :bahnhof:


----------



## hephaistos (29. Jun 2005)

halloa,

hab genau dasselbe problem momentan 

hab auch schon ziemlich herumprobiert!
was funktioniert ist: einen JPanel machen und den dort reinwerfen und das Label alignen... leider hab ich es dann nicht geschafft, den Panel auf eine vernünftige Höhe zu bringen 
hat schon jmd. eine lösung?

thx![/code]


----------



## mic_checker (29. Jun 2005)

was meinst du mit auf vernünftige höhe bringen ? Hab bei mir bei solchen Problemen meist auch das ganze in nem JPanel separat angeordnet und in die Box gesteckt (bzw. beim BoxLayout verwendet). Gab eigentlich keine Probleme damit.


----------



## Landei (30. Jun 2005)

Also, wenn ich Handstände machen muss, weil BoxLayout einfach ZU DOOF dafür ist, dann bastele ich mir lieber gleich eine Klasse BoxLayoutWhichCanHandleJLabels...


----------



## hephaistos (30. Jun 2005)

@mic_checker: könntest du mal ein kl. Beispiel posten? wär super!

thx!


----------



## Landei (30. Jun 2005)

Hier ein Progrämmchen zur Problemverdeutlichung:


```
import javax.swing.*;
import java.awt.*;

public class BoxTest extends JFrame {

    public BoxTest() {
        getContentPane().setLayout(new FlowLayout());
        setSize(200,200);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        initBox();
        setVisible(true);
    }
    
    private void initBox() {
        Box box = Box.createVerticalBox();
        getContentPane().add(box);
        JLabel label = new JLabel("Das ist ein Test");
        label.setBorder(BorderFactory.createEtchedBorder());
        JLabel label2 = new JLabel("Noch'n Test");
        label2.setBorder(BorderFactory.createEtchedBorder());
        JComboBox cmb = new JComboBox(new String[]{"A","B","C"});
        JTextField field = new JTextField("ödflgjdfö");
        box.add(label);
        box.add(cmb);
        box.add(label2);
        box.add(field);
    }
    
    public static void main(String[] args) {
        new BoxTest();
    }
}
```

Sieht grauenvoll aus...


----------



## Landei (30. Jun 2005)

Workaround: Mit Labels statt JLabels funktioniert es. Ist aber auch nicht das Gelbe vom Ei...


----------



## mic_checker (30. Jun 2005)

hephaistos: poste doch mal deinen code, hab meinen gerad net da...ist aber auch net aufregend: einfach das jpanel geholt, da entsprechend das layout gesetzt und dann das panel ins BoxLayout rein.

Landei: Wenn du alles wie bisher machst nur JLabel durch Label ersetzt funzt es? Denk dran, dass du nicht AWT und SWING mischen solltest.


----------



## Landei (30. Jun 2005)

Yo, Label statt JLabel und alles ist in Butter (sofern man mit Labels leben kann). Dass es Probleme beim Mixen von Swing und AWT gibt, habe ich selber schon erlebt (z.B. bei Canvas3D), aber hier scheinen sich alle Komponenten zu vertragen. Natürlich wäre mir eine Lösung mit JLabels auch lieber...


----------



## mic_checker (30. Jun 2005)

hephaistos: hab gerad nochma nachgeguckt, im letzten source in dem ich das verwendet hab , hab ich meine klasse von jpanel abgeleitet.


```
jPreLabel = new JLabel("Preorder :",JLabel.LEFT);
....
		
		preListPanel.add(jPreLabel,"North");

		ct.add(Box.createRigidArea(new Dimension(5,0)));
		ct.add(preListPanel);
		ct.add(Box.createRigidArea(new Dimension(5,0)));
		
		ct.add(inListPanel);
		ct.add(Box.createRigidArea(new Dimension(5,0)));

		ct.add(postListPanel);
		ct.add(Box.createRigidArea(new Dimension(5,0)));
```

ct war ein Container, inListPanel, postListPanel und preListPanel waren JPanel.

Ist natürlich die Frage wie genau du es haben willst und was du mit der höhe für Probleme hast....


----------



## hephaistos (30. Jun 2005)

hi!

sorry für die verzögerung!


```
contentPanel.add(new JLabel(name));
    	contentPanel.add(view.getTableHeader());
        contentPanel.add(view);
        contentPanel.add(Box.createRigidArea(new Dimension(0, 20)));
```
wobei contentPanel ein JPanel mit einem BoxLayout ist...

eure beispiele funktionieren bei mir leider nicht.
mit dem Label statt JLabel funktioniert die Darstellung überhaupt nicht 

thx!


----------



## Landei (1. Jul 2005)

Habe einen einfachen (um nicht zu sagen "strohdoofen") LayoutManager geschrieben, der folgende Eigenschaften hat:
- alle Komponenten werden vertikal linksbündig angeordnet
- nur die PreferredSize der Komponenten wird berücksichtigt
- man kann ein VerticalGap zwischen den Komponenten definieren
- eine Border der Papa-Komponente wird berücksichtigt
- mit createVerticalStrut können individuelle Lücken zwischen den Komponenten erzeugt werden (von Box geklaut)
- wenn der Platz zu klein ist - Pech gehabt (man kann den JPanel natürlich in eine JScrollPane packen)

Würde mich freuen, wenn ihr das Ding mal ausgiebig testet...


```
import java.awt.*;
import javax.swing.*;

public class ColumnLayout implements LayoutManager {

  private int vgap = 0;

  public ColumnLayout() {
  }

  public ColumnLayout(int vgap) {
    this.vgap = Math.max(0, vgap);
  }

  public void removeLayoutComponent(Component comp) {
  }

  public void layoutContainer(Container parent) {
    Insets insets = parent.getInsets();
    int width = parent.getWidth() - insets.left - insets.right;
    int x = insets.left;
    int y = insets.right;
    for(int i = 0; i < parent.getComponentCount(); i++) {
      Component comp = parent.getComponent(i);
      if (i > 0) {
        y += vgap;
      }
      int h = comp.getPreferredSize().height;
      comp.setBounds(x,y, width, h);
      y += h;
    }
  }

  public void addLayoutComponent(String name, Component comp) {
  }

  public Dimension minimumLayoutSize(Container parent) {
    return preferredLayoutSize(parent);
  }

  public Dimension preferredLayoutSize(Container parent) {
    int w = 0;
    int h = 0;
    for(int i = 0; i < parent.getComponentCount(); i++) {
      Component comp = parent.getComponent(i);
      if (i > 0) {
        h += vgap;
      }
      h += comp.getPreferredSize().height;
      w = Math.max(w, comp.getPreferredSize().width);
    }
    Insets insets = parent.getInsets();
    return new Dimension(w + insets.left + insets.right,
                         h + insets.top + insets.bottom);
  }

  public int getVerticalGap() {
    return vgap;
  }

  public static Component createVerticalStrut(int height) {
    return Box.createVerticalStrut(height);
  }

}
```

PS: Das Ding funktioniert auch mit JPanels :-D


----------



## hephaistos (1. Jul 2005)

hehe super!
des verwend ich jetzt 

danke dir!


----------



## Landei (1. Jul 2005)

Aber wie gesagt, ist noch nicht richtig getestet, also Vorsicht...

PS: Habe gerade nach "ColumnLayout" gegoogelt und ungefähr eine Zillion unterschiedliche Implementierungen gefunden. War wohl nicht der erste mit dem Problemchen...


----------

