2017-05-05 8 views
2

私はLongsで表される時間のリストを持っています。私はListViewでこれらの時間をMM:SS.LLL文字列にするためにLongs上でString.format()を呼び出すようにします。私は時間をミリ秒単位で表すLongsのリストを持っています。 MMを表示する前にLongsをMM:SS.LLLにフォーマットするListViewを作成するにはどうすればよいですか?

私はこのような何かを考えていた:より良い解決策があるようにリスナーを持つことなく、おそらくBindings.format()または同様のものを使用して、しかし、私は感じ

ObservableList<Long> scores = FXCollections.observableArrayList(); 
//add a few values to scores... 
scores.add(123456); 
scores.add(5523426); 
scores.add(230230478); 

//listen for changes in scores, and set all values of formattedScores based on scores values. 
ObservableList<String> formattedScores = FXCollections.observableArrayList(); 
scores.addListener(o -> { 
    formattedScores.clear(); 
    for (Long score : scores) { 
     formattedScores.add(String.format("%1$tM:%1$tS.%1$tL", String.valueOf(score))); 
    } 
}); 

//create an object property that can be bound to ListView. 
ObjectProperty<ObservableList<String>> scoresObjProperty = ObjectProperty<ObservableList<String>>(formattedScores); 

ListView<String> listView = new ListView<>(); 
listView.itemsProperty().bind(scoresObjProperty); 

は毎回すべての値を再計算しますリストが変更されます。

答えて

3

使用cell factory

cell factory

import javafx.application.Application; 
import javafx.collections.*; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.stage.Stage; 

import java.util.Calendar; 

public class TimeList extends Application { 
    @Override 
    public void start(final Stage stage) throws Exception { 
     ObservableList<Long> scores = FXCollections.observableArrayList(); 
     //add a few values to scores... 
     scores.add(123456L); 
     scores.add(5523426L); 
     scores.add(230230478L); 

     ListView<Long> listView = new ListView<>(scores); 
     listView.setCellFactory(param -> new ListCell<Long>() { 
      @Override 
      protected void updateItem(Long item, boolean empty) { 
       super.updateItem(item, empty); 

       if (item != null && !empty) { 
        Calendar calendar = Calendar.getInstance(); 
        calendar.setTimeInMillis(item); 
        String formattedText = String.format("%1$tM:%1$tS.%1$tL", calendar); 

        setText(formattedText); 
       } else { 
        setText(null); 
       } 
      } 
     }); 

     listView.setPrefSize(100, 100); 

     stage.setScene(new Scene(listView)); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
関連する問題