JLabel soll sich der Größe anpassen

Billie

Erfahrenes Mitglied
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*
 
Hallo,

eigentlich ist es Standardverhalten von Swing-Komponenten, was Du da beschreibst, zumindest mit den meisten Layout-Managern. Siehe das Beispiel:
Code:
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
 
Ja, da funktionierts, bei mir wieder nicht... hab auch etwas mit den GridBagConstraints herumgespielt, aber bisher ohne Erfolg 8)

PHP:
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;
    }
}
 
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?!
 
Hallo,

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

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

2. Das GridBagConstraints Objekt muss so aussehen (die Änderungen sind rot markiert)
Code:
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
 
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?
 
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
 
Zurück