# JLabel soll sich der Größe anpassen



## Billie (23. Oktober 2004)

Helas!

Hm, ich bin schon wieder zu müde um noch lange weiter nach der Lösung zu suchen. Besonders wenn ich nicht einmal weiß, nach was genau ich suchen soll. Aber egal, ich erklär nur schnell um was es geht. Also, ich möchte in einem kleinen JLabel anzeigen was gerade so passierst. Eigentlich genau so wie bei einem Browser, wo unten die Statuszeile liegt und immer kleine Hinweise erscheinen... "Verbindung zu Server etc. ", "Verbindung fehlgeschlagen" ... oder wie ein Installationsprogramm, wo gerade die Datei steht, die gerade kopiert wird.

Nun, das JLabel ist natürlich nicht das Problem - also, soweit bin ich dass ich ein JLabel mit Text programmieren kann (wer es nicht glaubt ... new JLabel("Text")). Das Problem ist, dieser Text ist eigentlich nur nebensächlich und wenn das Fenster verkleinert wird, hindert ein zu langer Text im JLabel mich daran das Fenster kleiner zu machen. Ich will also dass sich der Text automatisch verkürzt, wenn das Hauptfenster verkleinert wird... auf die weiße mit den 3 Punkten, also "Hallo Welt!" verkürzt zB "Hall...".

Gute Nacht, hab euch lieb!
*Gehirn auf das Nachtkästchen leg und schlafen geh*


----------



## Vincentius (23. Oktober 2004)

Hallo,

eigentlich ist es Standardverhalten von Swing-Komponenten, was Du da beschreibst, zumindest mit den meisten Layout-Managern. Siehe das Beispiel:
	
	
	



```
public class LabelTest {
    
    public static void main(String[] args) {
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 300);
        
        final Container c = frame.getContentPane();
        c.setLayout(new BorderLayout());
        
        final JLabel label = new JLabel("Langer langer langer langer langer Text");
        c.add(label, BorderLayout.CENTER);
        
        frame.setVisible(true);
    }
}
```
Ich habe das auch mit *GridLayout* und *GridBagLayout* getestet, mit dem gleichen Erfolg. Nur mit *FlowLayout* ist das Verhalten anders.

Gruß
Vincent


----------



## Billie (23. Oktober 2004)

Ja, da funktionierts, bei mir wieder nicht... hab auch etwas mit den GridBagConstraints herumgespielt, aber bisher ohne Erfolg 8)


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



class JChat {

    JChatGUI jChatGUI = new JChatGUI();

    JChat() {

    }

    public static void main(String args[]) {

        new JChat();
    }
}



class JChatGUI extends JFrame {

    static {
        JChatGUI.setDefaultLookAndFeelDecorated(true);
    }



    JChatGUI() {

        super("JChat 0.1");
        setSize(640, 500);
        add(connectPanel());
        setVisible(true);
    }

    private JPanel connectPanel() {
        GridBagLayout gbl = new GridBagLayout();
        JPanel connectPanel = new JPanel(gbl);

        JLabel statusLabel = new JLabel();
        statusLabel.setFont(new Font("Dialog", Font.PLAIN, 12));
        statusLabel.setText(statusLabel.getFont().toString());
        gbl.setConstraints(statusLabel, new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(10, 10, 10, 10), 0, 0));
        connectPanel.add(statusLabel);
        return connectPanel;
    }
}
```


----------



## Billie (24. Oktober 2004)

Also, ich habe das Problem noch nicht gelöst, aber einen neuen Hinweis gefunden. Erstaunlicherweise, wenn ich nicht das Standart L&F einschalte (JChatGUI.setDefaultLookAndFeelDecorated(true)), also mit dem normalen Windows Layout arbeite, lässt sich das JLabel verkleinern, so das der Text einfach abgeschnitten wird (jedoch ohne Punkte, aber vorerst egal).

Kann sich das jemand erklären, Bug?!


----------



## Vincentius (24. Oktober 2004)

Hallo,

abgesehen von dem *setDefaultLookAndFeelDecorated(true)* musst Du noch folgende Änderungen vornehmen:

1. In der Zeile
	
	
	



```
add(connectPanel());
```
müsstest Du eigentlich folgende Meldung kriegen: _Do not use JChatGUI.add() use JChatGUI.getContentPane().add() instead_. Es muss daher so heissen
	
	
	



```
getContentPane().add(connectPanel());
```

2. Das *GridBagConstraints* Objekt muss so aussehen (die Änderungen sind rot markiert)
	
	
	



```
gbl.setConstraints(statusLabel, new GridBagConstraints(0, 0, 1, 1, 
    1, 1, GridBagConstraints.CENTER, GridBagConstraints.CENTER,
    new Insets(10, 10, 10, 10), 0, 0));
```

Gruß
Vincent


----------



## Billie (24. Oktober 2004)

Ok, ich habe jetzt mal schnell probiert und soweit hat das auch funktioniert. Danke!

Aber, wieso kann ich nicht mit dem setDefaultLookAndFeelDecorated(true) arbeiten, wieso erziele ich damit andere Ergebnise? Das sollte doch wohl nicht so sein? Gibt es eine Möglichkeit wie ich trotzdem mit setDefaultLookAndFeelDecorated(true) arbeiten kann?


----------



## Thomas Darimont (24. Oktober 2004)

Hallo!



> ...
> add(connectPanel());
> 
> müsstest Du eigentlich folgende Meldung kriegen: Do not use JChatGUI.add() use JChatGUI.getContentPane().add() instead. Es muss daher so heissen
> ...



Ab Java 5 reicht es nun (nach 7 Jahren endlich!) einfach bei einem JFrame add(Component comp) statt getContentPane().add(Component cmp) aufzurufen um eine Komponente hinzuzufügen.

Gruß Tom


----------

