2016-10-09 18 views
-1

TableViewを使用してJavaFXアプリケーションを構築しており、さまざまなユーザーの選択に応じて色を動的に変更したいと考えています。最初は色付きのデータを取り込むことができますが、元の色を維持しています。JavaFXが動的に色付けされたテーブルビューをリフレッシュする

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); 

メソッドが色を決定するために、私のセル値の工場でテストされている別の文字列値を返します。

これは、ユーザーが何かを変更するたびに動的に呼び出され、私の方法の基本的な機能があります

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は、初期設定時に提供されるString値に基づいてテキストに色を付けますが、再度呼び出されたときには表示されません。私のupdateitem(String、boolean)メソッドのオーバーライドが呼び出され、テキスト値が変更されますが、変更されたテキストの色も更新/更新されません。

どのように色を動的に変更するのですか?

+0

isEmpty()がtrueの場合は、セルは無関係ですが、テキスト( 'setText(null)')をクリアする必要があります。 'updateItem(...)'メソッドが呼び出され、アイテムが変更されていることを確認したとしたら、 'case'ステートメントのいずれかを入力しているかどうか確認できますか? –

+0

私はそれがうまくいくはずだということに同意します。 Javaは私の最初の言語ではなく、JavaFXは私が構築した最初のGUIではないので、私はまだ学んでいます。なんらかの理由で、まだ動作しません。私は、isEmpty()がsetText(null)を追加し、チェックする文字列を追加したときにcase文を入力していて、別々のcaseを正しく入力していて、テキストを変更していますが色は変更していません。 – caleb

+0

あなたの質問を編集して[MCVE](* minimal *と* complete *に重点を置く)を含める必要があるでしょう。私は通常、これにはCSSアプローチを使用しますが、このアプローチがうまくいかない理由は明らかです。 –

答えて

0

私はそれを理解しました。私にとってはうまくいかなかったsetTextFill()メソッドを使用する代わりに、setStyle( " - fx-text-fill:")を使用しました。これは問題を解決するように思われた。テーブルは、私が意図したとおり動的にリフレッシュされるようになりました。

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); 
         } 
        } 
       }; 
      } 
     }); 
関連する問題