JavaFX Alternativtext

Lucaaa

Bekanntes Mitglied
Hallo!
Ich möchte In einem Label einen Text anzeigen.
Folgendes soll passieren:
- Wenn nicht genügend Platz ist, um den Text anzuzeigen, soll eine Abkürzung angezeigt werden.
Beispiel: Deutschland - DE
(Dies sit nur ein Beispiel wie gesagt, das angezeigte hängt von Benutzer ab)
Wie kriege ich das am besten hin?
 

Javinner

Top Contributor
Java:
public class Window extends JFrame
{

    private final int label_laenge = 100;
    private final int max_text = 12; //Ausgetestet

    public Window() throws HeadlessException
    {
        createWindow();
        String string = "Deeeeuuuuttttsssccchhhlllaaannnddd";
        JLabel label = new JLabel(string.length() >= max_text ? "DE" : string);
        label.setBounds(10, 10, label_laenge, 30);
        add(label);
    }

    private void createWindow()
    {
        setSize(500, 400);
        setResizable(false);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(null);
        setVisible(true);
    }

}
 

mihe7

Top Contributor
Das wird wohl in meiner FX-Application nicht sonderlich gut funktionieren. (siehe tag)
Ob Swing-JLabel oder JavaFX-Label spielt doch in dem Ansatz keine Rolle. Der Punkt dabei ist string.length() >= max_text ? "DE" : string.

Das wesentliche größere Problem sehe ich bei "max_text = 12; // Ausgetestet", weil sich eine "maximale Breite" nur in Sonderfällen austesten lässt.

In Swing ist das in ein paar Zeilen dynamisch realisierbar, in JavaFX weiß ich es nicht. Daher finde ich die Eingangsfrage von @Lucaaa sehr schön, denn jetzt kann mal gezeigt werden, warum JavaFX als Swing-Nachfolger gilt.
 

Robat

Top Contributor
Ist auf jeden Fall eine interessante Aufgabe. Hab mal ein wenig recherchiert und bin auf diesen Post auf SO gestoßen. Demnach kann man über die eigentliche Node, die den Text enthält, feststellen, ob der Text im Label gekürzt wurde (und somit die 3 Punkte am Ende hat). Das hat mich auf folgende Idee gebracht:
Man fügt einen ChangeListener der widthProperty() des Labels hinzu und reagiert somit auf Änderungen. Bei jeder Änderung schaut man, ob der Text im Label gekürzt wurde. Wenn ja merkt man sich die Breite des Labels um den ursprünglichen Text bei Bedarf wieder herzustellen und ersetzt den Text durch die Abkürzung. Sobald die nötige Breite wieder erreicht hat um den Text darzustellen, zeigt man den originalen Text wieder an.
Das ganze könnte so aussehen:
Java:
public class TruncateWidthPropertyListener implements ChangeListener<Number> {
   
    private final Label label;

    private final String originalText;
    private final String shorten;

    private double widthToRestore;

    public TruncateWidthPropertyListener( Label label, String shorten ) {
        this.label = label;
        this.originalText = label.getText();
        this.shorten = shorten;
    }

    @Override
    public void changed( ObservableValue<? extends Number> observable, Number oldValue, Number newValue ) {
        if ( newValue.doubleValue() > widthToRestore && widthToRestore != 0 ) {
            label.setText(originalText);
        } else {
            Text text = ( Text ) label.lookup(".text");
            String actualString = text.getText();

            if ( actualString.endsWith("...") ) {
                widthToRestore = newValue.doubleValue();
                label.setText(shorten);
            }
        }
    }
}
Benutzt werden kann das ganze dann so (Komponente kann natürlich auch in nem Controller geladen werden):
Java:
VBox root = new VBox();

Label label = new Label("Deutschlaaaand");
label.widthProperty().addListener(new TruncateWidthPropertyListener(label, "DE"));
label.prefWidthProperty().bind(root.widthProperty());
root.getChildren().add(label);

Wichtig
Die ganze Idee ist sozusagen in einer Nebel - und Nachtaktion entstanden. Ich weiß nicht inwiefern das ganze auch bei anderen Layouts funktioniert, geschweige denn wie es in einer vollständigen GUI klappt.
Vielleicht ist es trotzdem eine gute Anregung für dich (oder andere) und daraus entsteht eine Lösung, die deinen Ansprüchen gerecht wird :)
 

Neue Themen


Oben