2016-09-06 27 views
0

リストビューのアイテムを更新する際に問題があります。リストビューのフォントの色を数字で変更しようとしています。JavaFx ListView <Float>すべてのアイテムのフォントの色を設定します

my listView

数が< 6.0である場合、私は意味し、特定のアイテムのフォントの色は、それ以外の場合は緑色であるべきである、赤でなければなりません。 ここに私が試したコードです: スタックトレース

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException 
at main.Controller$ColoredCell.updateItem(Controller.java:88) 
at main.Controller$ColoredCell.updateItem(Controller.java:83) 
at javafx.scene.control.ListCell.updateItem(ListCell.java:480) 
at javafx.scene.control.ListCell.access$300(ListCell.java:72) 
at javafx.scene.control.ListCell$4.invalidated(ListCell.java:299) 
at javafx.beans.property.ObjectPropertyBase.markInvalid(ObjectPropertyBase.java:111) 
at javafx.beans.property.ObjectPropertyBase.set(ObjectPropertyBase.java:146) 
at javafx.scene.control.ListCell.setListView(ListCell.java:305) 
at javafx.scene.control.ListCell.updateListView(ListCell.java:494) 
at com.sun.javafx.scene.control.skin.ListViewSkin.createCell(ListViewSkin.java:292) 
at com.sun.javafx.scene.control.skin.ListViewSkin.lambda$new$366(ListViewSkin.java:99) 
at com.sun.javafx.scene.control.skin.VirtualFlow.getCell(VirtualFlow.java:1777) 
at com.sun.javafx.scene.control.skin.VirtualFlow.getCellLength(VirtualFlow.java:1879) 
at com.sun.javafx.scene.control.skin.VirtualFlow.computeViewportOffset(VirtualFlow.java:2528) 
at com.sun.javafx.scene.control.skin.VirtualFlow.layoutChildren(VirtualFlow.java:1189) 
at javafx.scene.Parent.layout(Parent.java:1087) 
at javafx.scene.Parent.layout(Parent.java:1093) 
at javafx.scene.Parent.layout(Parent.java:1093) 
at javafx.scene.Parent.layout(Parent.java:1093) 
at javafx.scene.Scene.doLayoutPass(Scene.java:552) 
at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2397) 
at com.sun.javafx.tk.Toolkit.lambda$runPulse$30(Toolkit.java:355) 
at java.security.AccessController.doPrivileged(Native Method) 
at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:354) 
at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:381) 
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:510) 
at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:490) 
at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$404(QuantumToolkit.java:319) 
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 
at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method) 
at com.sun.glass.ui.gtk.GtkApplication.lambda$null$49(GtkApplication.java:139) 
at java.lang.Thread.run(Thread.java:745) 

プロセスが終了コードで終了し

public void loadMarksListView(String key){ 
    ObservableList<Float> items = FXCollections.observableArrayList(); 
    items.addAll(subjectsMarks.get(key)); 
    marksListView.setItems(items); 

    marksListView.setCellFactory(new Callback<ListView<Float>, ListCell<Float>>() { 
     @Override 
     public ListCell<Float> call(ListView<Float> param) { 
      return new ColoredCell(); 
     } 
    }); 
} 

static class ColoredCell extends ListCell<Float>{ 
    @Override 
    public void updateItem(Float number, boolean empty) { 
     super.updateItem(number, empty); 

     if (Float.parseFloat(number.getClass().toString()) < 6.0f){ 
      this.setTextFill(Color.RED); 
     } 
     else{ 
      this.setTextFill(Color.GREEN); 
     } 
    } 
} 

EDITは0

+1

なぜ 'Float.parseFloat(number.getClass()。toString())'を使用していますか? 'number.getClass()。toString()'の出力は文字列形式の 'class java.lang.Float'で、' Float.parseFloat() 'メソッドを使用すると' NumberFormatException'がスローされます。 。たぶんそれはエラーです: 'if(number <6.0f)'と書くだけです。 – aleb2000

+0

それはエラーですが、それは考えて動作しません、スタックトレースは、nullポインタの例外があると言います。 –

+0

スタックトレースも投稿できますか? – aleb2000

答えて

1

問題は、あなたのupdateItem()方法であなたがいるかどうかを確認しなければならないということですアイテムは次のように空です:

static class ColoredCell extends ListCell<Float>{ 
    @Override 
    public void updateItem(Float number, boolean empty) { 
     super.updateItem(number, empty); 

     if(number == null || empty) { 
      setText(null); 
      setGraphic(null); 
     } else { 

      setText(number.toString()); // This line is very important! 

      if (number < 6.0f){ 
       this.setTextFill(Color.RED); 
      } else { 
       this.setTextFill(Color.GREEN); 
      } 
     } 
    } 
} 

EDIT: セルのテキストを手動で設定する必要があります。セルをレンダリングする方法を再定義するので、必要なすべてのグラフィックコンポーネントと値を追加する必要があります(それぞれのアイコンを追加する場合既定のセルをもう使用しないため、ColoredCellクラスでsetGraphic()メソッドを呼び出す必要があります。

+0

数字がnullであるかどうかをチェックしても、まだテキストが色づけされていない –

+0

Mmm ...この時点では、何が問題を引き起こす可能性があるか分からず、いくつかのテストを行い、その仕事をする – aleb2000

+0

@UmbertoPalazzini私はいくつかのテストを行い、セルのテキストが消えたことが起こった。問題は、セルにテキストを追加していないことです。これを行うには、ListCellの 'setText()'メソッドを呼び出す必要があります。 – aleb2000

関連する問題