2016-11-24 12 views
0

新スカラ座やscalafxに、簡単な株価アプリでテーブルビューで問題を持つ[注:方法を除いていない前のJavaFXの経験、それはAndroidのものに似ている]誤ったデータ

問題:(画像を参照)誤ったデータが変更欄に表示されます。

作成するには:複数のシナリオは、ここでは新しいティッカーシンボルのエントリです。いくつの細胞が間違っているのかは予測できないようです。ウィンドウのサイズを変更すると、一般に、より多くの不良セルが作成されます。 windowsizeやシンボルリストへの変更がない場合は決して起こりません。

以下の 'ticker'列と 'change'列のコードですが、変更列をどのように実装して緑色/赤色のテキストの色付けを行うかがわかります。

(注:データは新しいシンボルがすぐ見積もりデータが表示されない理由である定期的に単一のバッチで更新されます)

 val colTicker = new TableColumn[Quote, String] { 
     editable = true 
     text = "Ticker" 
     prefWidth = 80 
     alignmentInParent = scalafx.geometry.Pos.Center 
     cellValueFactory = { 
     _.value.ticker 
     } 
     cellFactory = _ => new TextFieldTableCell[Quote, String](new DefaultStringConverter()) 
     onEditCommit = (evt: CellEditEvent[Quote, String]) => { 
     val quote: Quote = evt.rowValue 
     val newTickerVal: String = evt.newValue.toUpperCase() 
     val oldTickerVal: String = evt.oldValue 
     // is it a valid ticker and not a dupe or is it blank (erase old ticker)? 
     if ((isValidTicker(newTickerVal) || newTickerVal.length == 0) && !symbolList.contains(newTickerVal)) { 
      // lock in the new value on the screen 
      quote.ticker.set(newTickerVal) 
      // if the new value is not empty add it to symbol list 
      if (newTickerVal.length > 0) { 
      symbolList.append(newTickerVal) 
      } 
      // now delete the old value 
      symbolList -= oldTickerVal 
      // sort and add another blank line 
      characters.sortWith(_.ticker.getValueSafe < _.ticker.getValueSafe) 
      if (oldTickerVal.length < 1) characters += Quote() 
      // now need to update the data file 
      putListToFile(dataFile, symbolList.sorted) 
     } else { 
      // bad ticker so keep the old one and don't update file 
      quote.ticker.set(oldTickerVal) 
      evt.getTableView.getColumns.get(0).setVisible(false) 
      evt.getTableView.getColumns.get(0).setVisible(true) 
      println("bad ticker, exiting symbol list: " + symbolList) 
     } 
     } 

    } 
    val colLast = new TableColumn[Quote, String] { 
     editable = false 

     text = "Last" 
     cellValueFactory = { 
     _.value.last 
     } 

     prefWidth = 80 
     alignmentInParent = scalafx.geometry.Pos.Center 
    } 
    val colChange = new TableColumn[Quote, String] { 
     editable = false 
     text = "Change" 
     cellFactory = { 
     _ => 
      new TableCell[Quote, String] { 
       item.onChange { (_, _, newChange) => 
       if (newChange != null) { 
        if (newChange.toString.contains("+")) textFill = Color.Green 
        else textFill = Color.Red 
        text = newChange 
       } 
       } 
      } 
     } 
     cellValueFactory = { 
     _.value.change 
     } 
     prefWidth = 80 
     alignmentInParent = scalafx.geometry.Pos.Center 
    } 

enter image description here

答えて

1

レンダリング時のJavaFXは、細胞を再利用しています。これは特に、TableViewのコンテンツを動的に更新する場合に顕著です。 cellFactoryは受信時にセルの内容を消去する必要があります。nullアイテム:textgraphicnullに設定する必要があります。

cellFactory = {_ => 
    new javafx.scene.control.TableCell[Quote, String] { 
    override def updateItem(item: String, empty: Boolean): Unit = { 
     super.updateItem(item, empty) 
     if (item == null || empty) { 
     text = null 
     graphic = null 
     } 
     else { 
     ... 
     } 
    } 
    } 
} 
:あるでも信頼性の高い、あなたが emptyフラグに渡している方法 updateItemjavafx.scene.control.TableCellを実装し、上書きして cellFactoryのJavaFXの方法を実装する必要があります単に newChange == null

cellFactory = { _ => 
    new TableCell[Quote, String] { 
    item.onChange { (_, _, newChange) => 
     if (newChange == null) { 
     text = null 
     graphic = null 
     else { 
     if (newChange.toString.contains("+")) textFill = Color.Green 
     else textFill = Color.Red 
     text = newChange 
     } 
    } 
    } 
} 

をチェックするのに十分であり得ます