2016-10-09 3 views
-1

Ich baue eine JavaFX-Anwendung mit einem TableView, und ich möchte es dynamisch abhängig von verschiedenen Benutzerauswahlen ändern. Ich kann es anfänglich mit farbigen Daten füllen, aber beim Aktualisieren werden die ursprünglichen Farben beibehalten.JavaFX erfrischend dynamisch farbige Tabellenansicht

Dies ist die grundlegende Funktionalität meiner Methode, die der Benutzer etwas ändert sich dynamisch jedes Mal aufgerufen wird:

SessionsTableView.getItems().clear(); 
ObservableList<SessionItem> newsessionitems = FXCollections.observableArrayList(); 
for (SessionPart x : AllSessionParts) { 
    tableitems.add(new SessionItem(count, x.name, x.getdurationasString(true, 150.0), getambiencetext(x), x.goals_getCurrentAsString(true, 150.0))); 
    newsessionitems.add(x); 
    count++; 
} 
SessionsTableView.setItems(newsessionitems); 

Methoden verschiedene String-Werte zurück, die in der Zelle Wert Fabrik getestet Farbe zu bestimmen:

DurationColumn.setCellFactory(new Callback<TableColumn<SessionItem, String>, TableCell<SessionItem, String>>() { 
       @Override 
       public TableCell<SessionItem, String> call(TableColumn<SessionItem, String> param) { 
        return new TableCell<SessionItem, String>() { 
         @Override 
         protected void updateItem(String item, boolean empty) { 
          super.updateItem(item, empty); 
          if (! isEmpty()) { 
           switch (item) { 
            case "No Duration Set": 
             setTextFill(Color.RED); 
             break; 
            case "Short Duration Set": 
             setTextFill(Color.YELLOW); 
             break; 
            default: 
             setTextFill(Color.BLACK); 
             break; 
           } 
           setText(item); 
          } 
         } 
        }; 
       } 
      }); 

JavaFX färbt den Text basierend auf den String-Werten, die beim ersten Auffüllen angegeben wurden, nicht jedoch beim erneuten Aufruf. Mein Override der Methode updatestitem (String, boolean) wird aufgerufen, und die Textwerte werden geändert, aber die Farben selbst des geänderten Texts werden nicht aktualisiert/aktualisiert.

Wie bekomme ich die Farben dynamisch ändern?

+0

Scheint wie sollte das funktionieren (nicht verwandt, aber Ihre Zelle sollte den Text löschen ('setText (null)') wenn 'isEmpty()' ist wahr). Sie haben angegeben, dass Sie überprüft haben, dass die Methode 'updateItem (...)' aufgerufen wird und das Element geändert wird. Können Sie überprüfen, ob es eine der 'case'-Anweisungen eingibt? –

+0

Ich stimme zu, es sollte funktionieren. Java ist nicht meine erste Sprache und JavaFX ist nicht meine erste GUI, mit der ich gebaut habe, also lerne ich immer noch. Aus irgendeinem Grund funktioniert es immer noch nicht. Ich habe einen setText (null) hinzugefügt, wenn isEmpty() ist und die case-Anweisungen eingibt, während ich einen zu überprüfenden String hinzufüge und jeden der verschiedenen Fälle korrekt eingibt, und zwar den Text, aber nicht die Farbe. – caleb

+0

Wahrscheinlich müssen Sie dann Ihre Frage bearbeiten [MCVE] (Schwerpunkt auf * minimal * und * vervollständigen *). Normalerweise verwende ich dafür einen CSS-Ansatz, aber es gibt keinen offensichtlichen Grund, warum dieser Ansatz nicht funktioniert. –

Antwort

0

Ich fand es heraus. Anstatt die Methode setTextFill() zu verwenden, die für mich nicht funktionierte, habe ich setStyle ("- fx-text-fill:") verwendet. Dies schien das Problem zu lösen. Die Tabelle wird nun dynamisch aktualisiert, so wie ich es beabsichtigt habe.

DurationColumn.setCellFactory(new Callback<TableColumn<SessionItem, String>, TableCell<SessionItem, String>>() { 
      @Override 
      public TableCell<SessionItem, String> call(TableColumn<SessionItem, String> param) { 
       return new TableCell<SessionItem, String>() { 
        @Override 
        protected void updateItem(String item, boolean empty) { 
         super.updateItem(item, empty); 
         if (! isEmpty()) { 
          switch (item) { 
           case "No Duration Set": 
            setTextFill(Color.RED); // Doesn't Work 
            setStyle("-fx-text-fill: red") // Does Work 
            break; 

          } 
          setText(item); 
         } 
        } 
       }; 
      } 
     }); 
Verwandte Themen