- Всякий раз, когда конкретная табличка < /code> в табличке < /code> обновляется, цвет строки будет изменен на красную, а через 3 секунды цвет должен быть автоматически возвращен к оригиналу. < /li>
< /ol>
ниже mcve < /strong>, < /p>
Основной класс < /strong> < /p>
), я стараюсь проверить, составляет ли разница между текущим временем и обновлением больше, чем 3 секунды - удаление красного цвета.Код: Выделить всё
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
Код: Выделить всё
createTimerэто правильный способ достичь того, что я хочу? Почему tr.getItem () возвращает null .
для тестирования [/b]: я запустил код и ждал исполнителя кода и проверил, был ли красный цвет удален через 3 секунды.
Подробнее здесь: https://stackoverflow.com/questions/525 ... row-update