0
- Работа с приложением таймера, которое выводится на консоль во время работы приложения.
- Я хочу все такую же информацию для печати в текстовой области приложения.
- Он будет печатать текущую активность только в текстовой области, но не будет печатать все.
- Пытался использовать ListView вместо TextArea, но не смог понять, как его перевести в приложение. Есть ли более простой способ сделать это?
- Изображение показывает: стрелка 2 «loggedMessages» = это только сохраняет последнее действие. стрелка 3 - это консоль со всеми зарегистрированными действиями. Я хочу, чтобы область loggedMessage отображала все действия, которые захватывает консоль.
Вот код:JavaFX TextArea для интеграции с ListView
public class Controller {
@FXML private AnchorPane container;
@FXML private Label title;
@FXML private TextArea inputMessage;
@FXML private TextArea loggedMessages;
private Timeline mTimeline;
private TimerAttempt mCurrentAttempt;
private StringProperty mTimerText;
public Controller(){
mTimerText = new SimpleStringProperty();
setTimerText(0);
}
public String getTimerText() {
return mTimerText.get();
}
public StringProperty timerTextProperty() {
return mTimerText;
}
public void setTimerText(String timerText) {
this.mTimerText.set(timerText);
}
public void setTimerText(int remainingSeconds){
int minutes = remainingSeconds/60;
int seconds = remainingSeconds % 60;
setTimerText(String.format("%02d:%02d", minutes, seconds));
}
private void prepAttempt(AttemptKind kind){
reset();
mCurrentAttempt = new TimerAttempt(kind, "");
addAttemptStyle(kind);
title.setText(kind.getTheDisplayName());
setTimerText(mCurrentAttempt.getRemainingSeconds());
mTimeline = new Timeline();
mTimeline.setCycleCount(kind.getAmountOfSeconds());
mTimeline.getKeyFrames().add(new KeyFrame(Duration.seconds(1), e ->{
mCurrentAttempt.tickDown();
setTimerText(mCurrentAttempt.getRemainingSeconds());
}));
mTimeline. setOnFinished(e -> {
saveCurrentAttempt();
mApplause.play();
prepAttempt(mCurrentAttempt.getTypeOfAttempt() == AttemptKind.STUDYING ?
AttemptKind.BREAK : AttemptKind.STUDYING);
});
}
private void saveCurrentAttempt() {
mCurrentAttempt.setMessage(inputMessage.getText());
mCurrentAttempt.save();
loggedMessages.setText(String.valueOf(mCurrentAttempt));
inputMessage.clear();
}
private void reset() {
clearAttemptStyles();
if (mTimeline != null && mTimeline.getStatus() == Animation.Status.RUNNING) {
mTimeline.stop();
}
}
private void addAttemptStyle(AttemptKind kind) {
container.getStyleClass().add(kind.toString().toLowerCase());
}
private void clearAttemptStyles(){
container.getStyleClass().remove("playing");
for (AttemptKind kind : AttemptKind.values()){
container.getStyleClass().remove(kind.toString().toLowerCase());
}
}
// ----------------------- Таймер класса -------------------
public class TimerAttempt {
private String mMessage;
private int mRemainingSeconds;
private AttemptKind mTypeOfAttempt;
public TimerAttempt(AttemptKind kind, String inputMessage) {
mTypeOfAttempt = kind;
mMessage = inputMessage;
mRemainingSeconds = kind.getAmountOfSeconds();
}
public AttemptKind getTypeOfAttempt() {
return mTypeOfAttempt;
}
public String getMessage() {
return mMessage;
}
public int getRemainingSeconds() {
return mRemainingSeconds;
}
public void setMessage(String message) {
mMessage = message;
}
public void tickDown() {
mRemainingSeconds --;
}
public void save() {
System.out.printf("LOGGED: %s %n ", this);
}
@Override
public String toString() {
Date date = new Date();
SimpleDateFormat timeStamp = new SimpleDateFormat("MM/dd/yyyy h:mm;ss a");
String formattedDate = timeStamp.format(date);
return formattedDate +
"\n Working on: " + mMessage +
"\n During : " + mTypeOfAttempt + '\n';
}
}
Это делает именно то, что мне нужно. Спасибо за простое объяснение. – Brown