Обновление строки таблицы JavafxJAVA

Программисты JAVA общаются здесь
Anonymous
Обновление строки таблицы Javafx

Сообщение Anonymous »

Сценарий, которого я пытаюсь достичь, - < /p>
  • Всякий раз, когда конкретная табличка < /code> в табличке < /code> обновляется, цвет строки будет изменен на красную, а через 3 секунды цвет должен быть автоматически возвращен к оригиналу. < /li>
    < /ol>

    ниже mcve < /strong>, < /p>

    Основной класс < /strong> < /p>

    Код: Выделить всё

    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import javafx.application.Application;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.scene.Scene;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableView;
    import javafx.stage.Stage;
    
    public class TestProjectWin10 extends Application {
    private final ObservableList data = FXCollections.observableArrayList();
    
    public final Runnable changeValues = () -> {
    int i = 0;
    while (i  {
    Thread t = new Thread(runnable);
    t.setDaemon(true);
    return t;
    });
    
    @Override
    public void start(Stage primaryStage) {
    
    TableView table = new TableView();
    table.getStylesheets().add(this.getClass().getResource("tableColor.css").toExternalForm());
    table.setEditable(true);
    
    TableColumn nameCol = new TableColumn("Name");
    nameCol.setPrefWidth(200);
    nameCol.setCellValueFactory(cell -> cell.getValue().nameProperty());
    nameCol.setCellFactory((TableColumn param) -> new ColorCounterTableCellRenderer(table));
    table.getColumns().add(nameCol);
    
    this.data.add(new Element());
    table.setItems(this.data);
    
    this.executor.submit(this.changeValues);
    
    Scene scene = new Scene(table, 600, 600);
    primaryStage.setScene(scene);
    primaryStage.show();
    }
    
    public static void main(String[] args) {
    launch(args);
    }
    }
    < /code>
    
     Класс элементов: < /strong> < /p>
    
    import java.util.concurrent.atomic.AtomicReference;
    
    import javafx.application.Platform;
    import javafx.beans.property.DoubleProperty;
    import javafx.beans.property.SimpleDoubleProperty;
    import javafx.beans.property.SimpleStringProperty;
    import javafx.beans.property.StringProperty;
    
    public class Element {
    int x = 0;
    
    private final StringProperty nameProperty = new SimpleStringProperty("");
    
    private final AtomicReference name = new AtomicReference();
    
    private final DoubleProperty occurence = new SimpleDoubleProperty();
    
    public void count() {
    x = x + 1;
    if (name.getAndSet(Integer.toString(x)) == null) {
    Platform.runLater(() -> nameProperty.set(name.getAndSet(null)));
    }
    }
    
    public void setOccurence(double value) {
    occurence.set(value);
    }
    
    public String getName() {
    return nameProperty().get();
    }
    
    public void setName(String name) {
    nameProperty().set(name);
    }
    
    public StringProperty nameProperty() {
    return nameProperty;
    }
    
    double getOccurrenceTime() {
    return occurence.get();
    }
    }
    < /code>
    
     cellfactory Code: < /strong> < /p>
    
    import java.util.Timer;
    import java.util.TimerTask;
    import javafx.application.Platform;
    import javafx.geometry.Pos;
    import javafx.scene.control.TableCell;
    import javafx.scene.control.TableRow;
    import javafx.scene.control.TableView;
    
    public class ColorCounterTableCellRenderer extends TableCell  {
    
    private final static long MAX_MARKED_TIME = 3000;
    private final static long UPDATE_INTERVAL = 1000;
    
    private static Timer t = null;
    private final String highlightedStyle = "highlightedRow";
    
    private final TableView tv;
    
    public ColorCounterTableCellRenderer(TableView tv) {
    this.tv = tv;
    createTimer();
    setAlignment(Pos.CENTER_RIGHT);
    }
    
    private void createTimer() {
    if (t == null) {
    t = new Timer("Hightlight", true);
    t.schedule(new TimerTask() {
    @Override
    public void run() {
    
    final long currentTime = System.currentTimeMillis();
    
    TableRow tr = getTableRow();
    if (tr.getItem() != null) {
    
    if (currentTime - ((Element) tr.getItem()).getOccurrenceTime() > MAX_MARKED_TIME) {
    Platform.runLater(() -> {
    tr.getStyleClass().remove(highlightedStyle);
    });
    }
    }
    }
    }, 0, UPDATE_INTERVAL);
    }
    }
    
    @Override
    protected void updateItem(String item, boolean empty) {
    if (empty || getTableRow() == null || getTableRow().getItem() == null) {
    setText(null);
    return;
    }
    
    long currentTime = System.currentTimeMillis();
    
    TableRow row = getTableRow();
    Element elementRow = row.getItem();
    
    double occurrenceTime = elementRow.getOccurrenceTime();
    
    if (currentTime - occurrenceTime < MAX_MARKED_TIME) {
    if (!row.getStyleClass().contains(highlightedStyle)) {
    row.getStyleClass().add(highlightedStyle);
    }
    }
    
    super.updateItem(item, empty);
    setText(item + "");
    
    }
    }
    < /code>
    
    и файл css tablecolor.css < /p>
    
    .highlightedRow {
    -fx-background-color: rgba(255,0,0, 0.25);
    -fx-background-insets: 0, 1, 2;
    -fx-background: -fx-accent;
    -fx-text-fill: -fx-selection-bar-text;
    }
    < /code>
    
    В чем проблема ..? < /p>
    
    
      Я проверяю, составляет ли разница между текущим временем и обновлением меньше 3 секунд - Code> Code) < /p> < /br /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pr /pro таймер (ColorCounterTableCellRenderer
    ), я стараюсь проверить, составляет ли разница между текущим временем и обновлением больше, чем 3 секунды - удаление красного цвета.
Но в таймере (

Код: Выделить всё

createTimer
- method) код: tr.getitem () всегда null и, следовательно, не удаляет красный цвет.

это правильный способ достичь того, что я хочу? Почему tr.getItem () возвращает null .

для тестирования [/b]: я запустил код и ждал исполнителя кода и проверил, был ли красный цвет удален через 3 секунды.

Подробнее здесь: https://stackoverflow.com/questions/525 ... row-update

Вернуться в «JAVA»