2016-11-24 71 views
0

新建Scala和scalafx且在一個簡單的股票報價的應用程序一個實現代碼如下的問題[注:除在方式沒有事先JavaFX的經驗,這是類似的東西的Android]錯誤數據

問題:(見圖)錯誤的數據顯示在變化欄中,應該沒有。

要創建:多種方案,此處顯示的是新條碼符號的輸入。看起來無法預測有多少個單元出現錯誤。改變窗口大小(比如更短,然後更高)通常會產生更多不好的單元格。如果不更改窗口大小和/或符號列表,則不會發生。

下面的'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項目:textgraphic需要設置爲null。這可能是足夠簡單地檢查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 
     } 
    } 
    } 
} 

這是也不可靠,你將不得不通過實施javafx.scene.control.TableCell和覆蓋方法updateItem被傳入empty標誌實施cellFactory JavaFX的方式:

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 { 
     ... 
     } 
    } 
    } 
}