2016-11-24 16 views
0
새로운 스칼라와 scalafx 간단한 주식 시세 응용 프로그램에있는 tableview에 문제가있는에

:잘못된 데이터

문제 [메모를 안드로이드 것들과 유사 방법들을 제외하고 이전에 자바 FX 경험] : (이미지 참조) 오류가없는 변경 열에 오류 데이터가 표시됩니다.

만들려면 : 여기에 표시된 여러 시나리오는 새로운 시세 표시 기호입니다. 얼마나 많은 세포가 잘못되었는지는 예측할 수없는 것처럼 보입니다. 창 크기를 변경하면 (일반적으로 짧고 높을수록) 더 나쁜 셀이 생성됩니다. windowsize 및/또는 기호 목록을 변경하지 않으면 절대로 발생하지 않습니다.

아래의 'ticker'및 'change'열에 대한 코드입니다. 변경 열을 구현하여 녹색/빨간색 텍스트 채색을 수행하는 방법과 관련이 있습니다.

: 렌더링 할 때 자바 FX 세포를 재사용한다

 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

(주 데이터는 새 심볼 즉시 견적 데이터를 표시하지 않는 이유입니다 정기적으로 하나의 배치에 업데이트됩니다). 특히 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 자바 FX 방법을 구현해야합니다 단순히 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 
     } 
    } 
    } 
} 

를 확인하기에 충분할 수있다