Wie man die ListView-Breite an die Breite ihrer Zellen anpasst

8

Ich habe eine ListView mit einer benutzerdefinierten Zellenfabrik. Ich berechne das Maximum über Zellen minWidth und setze es als minWidth für die gesamte ListView. Die ListView, die durch andere Regionen im Layout eingeschränkt wird, wird also genau auf minWidth geschrumpft. Aber die Zellen, die es enthält, werden auf die bevorzugte Breite, nicht minimal, angepasst. Daher passen Knoten nicht in das Ansichtsfenster und die horizontale Bildlaufleiste wird angezeigt.

Es ist böse. Ich möchte jede Zelle genau passend zu ListView machen und Scrollbar loswerden. Etwas genauer. Wenn ListView auf seine minimale Breite reduziert wird, sollten alle seine Zellen ebenfalls auf diese minimale Breite reduziert werden.

Ich suche nach einer kontrollierenden Eigenschaft, die die Zellen-Größenänderungs-Policy für einige Hacks umschaltet, um das beschriebene Verhalten zu erreichen, falls es keine vordefinierten Switches gibt.

update: Grafikbeispiel hinzugefügt

Ich habe SplitPane erstellt, um das Testen von Layouts zu vereinfachen. Ich kann Layouteinschränkungen definieren, indem ich das Trennzeichen mit der Maus verschiebe.

Der erste Screenshot zeigt das anfängliche Problem: Die tatsächlichen Abmessungen (min, max, pref) der Zellknoten werden nicht berücksichtigt. Die ListView verwendet immer prefWidth, auch wenn sie größer als die Breite des Darstellungsbereichs ist. So wird horizontale Scroll verwendet, wenn es vermieden werden kann.

Danach habe ich versucht, die bevorzugte Breite kleiner zu setzen. So ist die Zelle jetzt vollständig sichtbar. Dies ist nicht die Lösung. Ich gebe diese Aufnahme, um zu beweisen, dass die Zelle eine ausreichend kleine Breite hat, um in das ListView zu passen.

Der letzte Schuss ist auch hässlich. Es hinterlässt freien Speicherplatz, der mit Zelleninhalt gefüllt sein kann. Es ist natürlich: Wenn das Ansichtsfenster größer als die bevorzugte Breite und kleiner als die maximale Breite ist, sollte es für die Größenänderung des Zelleninhalts verwendet werden.

Das Problem kann unterdrückt werden, indem zu statischen Größen von explizit angegebenen Elementen gewechselt wird. Dies bedeutet jedoch, alle Vorteile dynamischer Layouts zu verwerfen: Der Programmierer wäre gezwungen, die Größenkonstanten jedes Mal zu ändern, wenn eine neue Skin mit CSS angewendet wird, und dem Benutzer wäre es untersagt, die Fenstergröße zu ändern oder das Trennzeichen mit der Maus zu verschieben.

Und das ist auch eine schlechte Lösung. Was ich brauche - um Layout-Engine von javafx arbeiten zu lassen. Die minimale Breite des ListView sollte die kleinste minimale Breite seiner Zellen sein. Die maximale Breite der ListView sollte die niedrigste maximale Breite ihrer Zellen sein. Die bevorzugte Breite der ListView sollte die größte bevorzugte Breite ihrer Zellen sein. Und dann sollte die tatsächliche Breite von ListView durch sein Elternteil (SplitPane in diesem Beispiel) in Bezug auf alle drei Layout-Grenzen gesetzt werden. Und danach sollte diese Größe an Zellen übergeben werden.

Die horizontale Bildlaufleiste sollte nur dann angezeigt werden, wenn eine minimale Zellenbreite zu groß ist, um in das Ansichtsfenster zu passen.

    
ayvango 26.04.2015, 23:31
quelle

1 Antwort

2

Binde einfach die prefWidthProperty der Zelle an die widthProperty der ListView. Ich subtrahiere ein bisschen für Grenzen und so.

Mit Strings erhalten Sie die Ellipse ... anstelle einer Bildlaufleiste.

%Vor%     
brian 08.05.2015 13:33
quelle

Tags und Links