2016-07-11 10 views
1

Ich habe ein seltsames Problem mit JavaFX und Font Awesome, die ich habe Probleme, die Ursache von. Das Problem ist noch komplizierter, weil ich den Code nicht wirklich teilen kann, und egal wie sehr ich versucht habe, das Problem in einem einfacheren Fall zu replizieren - ich konnte es nicht.Einige _instances_ von Glyphe verschwinden - wie kann man Grund erkennen?

Das Problem ist wie folgt - Ich habe eine TableView, in der jede Spalte eine Hyperlink als Grafik, mit einem Font Awesome Glyph hat. Das alles funktioniert gut, bis auf eine Stufe - in dieser Phase wird das erste Mal gezeigt, dass alles in Ordnung ist, aber beim zweiten Mal werden drei der Spaltenglyphen wieder zu Quadraten. Das ist seltsam, da alle Spalten das gleiche Zeichen derselben Schriftart verwenden.

Hier sind vor und nach Bilder - beachten Sie die Glyphen sind alle gleich, aber die linke diejenigen geworden Quadrate:

First showing of stage

Second showing of stage

Die Glyphen und Schrift sind durch FXML gesetzt und sind für alle Spalten gleich:

<TableColumn fx:id="col1" prefWidth="83.0" text="Column 1"><graphic> 
      <Hyperlink onAction="#requestFilter" text="" visited="true"> 
       <font> 
        <Font name="FontAwesome Regular" size="13.0" /> 
       </font></Hyperlink> 
     </graphic> 
</TableColumn> 
<TableColumn fx:id="col2" prefWidth="138.0" text="Column 2"><graphic> 
      <Hyperlink onAction="#requestFilter" text="" visited="true"> 
       <font> 
        <Font name="FontAwesome Regular" size="13.0" /> 
       </font></Hyperlink> 
     </graphic> 
</TableColumn> 
<TableColumn fx:id="col3" prefWidth="59.0" text="Column 3"><graphic> 
      <Hyperlink onAction="#requestFilter" text="" visited="true"> 
       <font> 
        <Font name="FontAwesome Regular" size="13.0" /> 
       </font></Hyperlink> 
     </graphic> 
</TableColumn> 
<TableColumn fx:id="col4" prefWidth="103.0" text="Column 4"><graphic> 
      <Hyperlink onAction="#requestFilter" text="" visited="true"> 
       <font> 
        <Font name="FontAwesome Regular" size="13.0" /> 
       </font></Hyperlink> 
     </graphic> 
</TableColumn> 

Hier sind die letzten zwei Spalten diejenigen, die ihre verlieren Glyphe (die Szene befindet sich in der Ausrichtung von rechts nach links).

Außerdem - es sind immer die letzten drei Spalten, die ihre Glyphe verlieren, das heißt - wenn ich beim ersten Anzeigen die Spalte neu anordne, verlasse ich die Spalten in der Tabelle (links, wieder - die Szene stimmt (links) verliert beim nächsten Mal, wenn die Stufe angezeigt wird, ihre Glyphe. Nachfolgendes Verstecken/Anzeigen wird keine Glyphen mehr verlieren.

Ich zeige die Bühne mit Stage#showAndWait, und ich behalte einen Verweis auf die Bühne, so dass es nur einmal erstellt wird.

Ich weiß, es ist schwer zu helfen, wenn ich keinen Code (Client Vertraulichkeit) teilen kann, also was ich frage ist - wo kann ich sehen, was passiert ist? Wie kommt es, dass einige Instanzen derselben Glyphe verschwinden und andere nicht? Ist sonst jemand auf so etwas gestoßen? Was war der Grund dafür?

Edit: Ich habe druckt debug hinzugefügt der die Eigenschaften Hyperlinks, und zwar mit der zweiten die Schrift zeigt, kehrt in den ‚System‘ für die letzten drei Spalten. Auf der Suche nach der Quelle der Änderung habe ich einen Änderungslistener hinzugefügt und Haltepunkt darin eingefügt. Der Stack zeigt, dass die Änderung innerhalb von applyCSS erfolgt, nach einer Menge interner Aufrufe, die auf showAndWait folgen, keine davon in meinem eigenen Code (d. H. - alle im JavaFX-Bibliothekscode). Es scheint aus irgendeinem Grund, dass JavaFX die Schriftartdefinition einiger Steuerelemente zurücksetzt, obwohl sie alle genau gleich definiert sind! Dies wird durch die Tatsache bestätigt, dass es egal ist, um welche Tabellenspalte es sich handelt, aber wo es in der TableView ist.

Es scheint also so, als ob ein fehlerhaftes JavaFX-Verhalten die Schriftart auf den Standard ("-fx-font") anstatt auf den auf dem Knoten selbst definierten zurücksetzt. Wer weiß genug über die JavaFX-CSS-Logik, um den Fehler zu finden?
Alle Hyperlinks haben keine benutzerdefinierten Stile oder Klassen festgelegt, und nur die 'besuchte' Pseudoklassengruppe.

Bearbeiten 2: Das Hinzufügen eines Schriftartnamens zum CSS behebt das Problem. Ich würde immer noch gerne die Quelle des Bugs finden (was ich, wie ich sicher bin, in der JavaFX-CSS-Handhabung ist), aber es ist zu chaotisch für mich, es jetzt durchzugehen.Die CSS ich benutze, ist:

.table-column .hyperlink { 
    -fx-font-family: "FontAwesome"; 
} 
+0

Verwenden Sie [FontAwesomeFx] (https://bitbucket.org/Jerady/fontawesomefx) oder [plain old FontAwesome] (http://fontawesome.io/)? –

+0

Warum haben die TableColumns Text? Warum haben sie unterschiedliche PrefWidths? Und warum alle besucht? Verwenden Sie CSS zum Erstellen von Steuerelementen. –

+0

Einfaches altes FontAwesome, geladen von einer ttf-Datei, die im JAR enthalten ist. Ich kann bestätigen, dass es korrekt geladen ist, und das gleiche Verhalten wird auf Systemen mit FontAwesome installiert oder ohne es installiert. – Itai

Antwort

1

Meine Wette, dass einige Code oder CSS-Styling irgendwo Hyperlink Schriftart oder Stil oder CSS-Klasse ändert. Sie können Debugging verwenden. Zum Beispiel können Sie Schaltfläche in der Nähe Ihrer Tableview fügen Sie einige Debug-Informationen, um so etwas zu drucken:

Button b = new Button("Debug"); 
    b.setOnAction(e->{ 
     TableView<?> tv = (TableView) scene.lookup("#tableView"); 
     for(TableColumn<?,?> tc : tv.getColumns()) { 
      Hyperlink link = (Hyperlink)tc.getGraphic(); 
      System.out.println("Column "+tc.getText()); 
      System.out.println("link text: "+link.getText()); 
      System.out.println("link Style: "+link.getStyle()); 
      System.out.println("link CSS Classes: " + link.getStyleClass()); 
      System.out.println("link CSS Pseudo Classes: " + link.getPseudoClassStates()); 
      System.out.println("link Font: " + link.getFont()); 
     } 
    }); 

dann auf diese Schaltfläche klicken, wenn Tabelle normal aussieht und Debug-Informationen irgendwo speichern. Klicken Sie erneut, wenn Quadrate angezeigt werden, und vergleichen Sie die Ausgabe mit der ersten. Untersuchen Sie auch Ihre CSS-Dateien und Code, die auf Tabellenspalten zugreifen können, wenn diese das Hyperlink-Styling beeinflussen können.
EDIT
Nun, es scheint mir ziemlich merkwürdig, dass JavaFX ganz von selbst interne Logik CSS-Stile entschieden nur für bestimmte Spalten neu zu berechnen und erneut anwenden und nicht für die ganze Szene (EDIT: nach JavaFX CSS Reference es tatsächlich kann css nur auf bestimmte Zweige im Szenegraphen erneut anwenden. Ich denke immer noch, dass die Ursache irgendwo in deinem Styling oder Code liegt. Ich bezweifle, dass irgendjemand Sie auf einen Ort verweisen kann, an dem Sie sich orientieren können, denn es scheint ein sehr spezifisches Problem zu sein und, wie Sie sagten, kann nicht in einem einfachen Szenario reproduziert werden. Vielleicht führen Sie eine bestimmte Layout-Logik durch, erstellen/ersetzen Tabellenknoten oder Ähnliches, schwer zu sagen, dass Sie den Code nicht sehen.
Wie auch immer, wenn Sie nur das Problem lösen möchten, würde ich vorschlagen, Hyperlink-Schriftart in CSS-Datei, nicht in fxml. Auf diese Weise stellen Sie sicher, dass auch im Falle einer CSS-Neuberechnung oder bei Layout-Manipulationen der Stil derselbe ist. Es wäre der richtige Weg, es trotzdem zu tun.
Wenn Sie die wahre Ursache eines Problems ausgraben möchten, ich fürchte, Sie müssen einige glückliche Stunden mit Ihrem Debugger verbringen :) Ich würde beginnen, die Unterschiede zwischen normaler Spalte und Spalte mit defekten Schriftart zu suchen. Warum behandeln sie auf unterschiedliche Weise?

+0

Wir scheinen irgendwo hin zu kommen! Ich werde in der Hauptfrage updaten, da es viel zu schreiben gibt. – Itai

+0

@sillyfly hinzugefügt einige Gedanken zu dem Problem – whitesite

+0

Ich habe dreifach überprüft - ich nie entfernen oder ändern Sie die Spalten, wenden Sie nie Styling auf sie und ändern Sie nie eine Eigenschaft, entweder durch Code oder über CSS. Das erneute Anwenden von Stilen geschieht in allen Spalten, nur für die letzten drei ändert sich die Schriftart. – Itai