我正在使用Hibernate和JavaFx。我想要做的是更改一個元素(行)並在更改後刷新它。如何在TableView上刷新數據變化中的單行
我不想刷新所有元素(因爲我發現它在教程中),我不能使用SimpleStringProperty,因爲它可能在JPA映射文件中使用它。
我試着刪除並添加相同的元素 - 元素被刪除,但不是再次添加。
請幫忙。
我正在使用Hibernate和JavaFx。我想要做的是更改一個元素(行)並在更改後刷新它。如何在TableView上刷新數據變化中的單行
我不想刷新所有元素(因爲我發現它在教程中),我不能使用SimpleStringProperty,因爲它可能在JPA映射文件中使用它。
我試着刪除並添加相同的元素 - 元素被刪除,但不是再次添加。
請幫忙。
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.util.Date;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.control.Button;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
public class ServiceSample extends Application {
final GetDailySalesService service = new GetDailySalesService();
private void init(Stage primaryStage) {
Group root = new Group();
primaryStage.setScene(new Scene(root));
VBox vbox = new VBox(5);
vbox.setPadding(new Insets(12));
TableView tableView = new TableView();
Button button = new Button("Refresh");
button.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent t) {
service.restart();
}
});
vbox.getChildren().addAll(tableView, button);
Region veil = new Region();
veil.setStyle("-fx-background-color: rgba(0, 0, 0, 0.4)");
ProgressIndicator p = new ProgressIndicator();
p.setMaxSize(150, 150);
//Define table columns
TableColumn idCol = new TableColumn();
idCol.setText("ID");
idCol.setCellValueFactory(new PropertyValueFactory("dailySalesId"));
tableView.getColumns().add(idCol);
TableColumn qtyCol = new TableColumn();
qtyCol.setText("Qty");
qtyCol.setCellValueFactory(new PropertyValueFactory("quantity"));
tableView.getColumns().add(qtyCol);
TableColumn dateCol = new TableColumn();
dateCol.setText("Date");
dateCol.setCellValueFactory(new PropertyValueFactory("date"));
dateCol.setMinWidth(240);
tableView.getColumns().add(dateCol);
p.progressProperty().bind(service.progressProperty());
veil.visibleProperty().bind(service.runningProperty());
p.visibleProperty().bind(service.runningProperty());
tableView.itemsProperty().bind(service.valueProperty());
StackPane stack = new StackPane();
stack.getChildren().addAll(vbox, veil, p);
root.getChildren().add(stack);
service.start();
}
public class GetDailySalesService extends Service<ObservableList<DailySales>> {
@Override
protected Task createTask() {
return new GetDailySalesTask();
}
}
public class GetDailySalesTask extends Task<ObservableList<DailySales>> {
@Override protected ObservableList<DailySales> call() throws Exception {
for (int i = 0; i < 500; i++) {
updateProgress(i, 500);
Thread.sleep(5);
}
ObservableList<DailySales> sales = FXCollections.observableArrayList();
sales.add(new DailySales(1, 5000, new Date()));
sales.add(new DailySales(2, 2473, new Date(0)));
return sales;
}
}
public class DailySales {
private Integer dailySalesId;
private Integer quantity;
private Date date;
public DailySales() {
}
public DailySales(int id, int qty, Date date) {
this.dailySalesId = id;
this.quantity = qty;
this.date = date;
}
public Integer getDailySalesId() {
return dailySalesId;
}
public void setDailySalesId(Integer dailySalesId) {
this.dailySalesId = dailySalesId;
}
public Integer getQuantity() {
return quantity;
}
public void setQuantity(Integer quantity) {
this.quantity = quantity;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
@Override public void start(Stage primaryStage) throws Exception {
init(primaryStage);
primaryStage.show();
}
public static void main(String[] args) { launch(args); }
}
我開始使用TableView綁定到數據庫表時遇到了同樣的問題。我會更新一個對象的數據,該對象顯示在表的一行中,並且由於數據結構是一個ObservableList,我希望數據可以自動刷新。不會發生,並且有一個開放的(最後我檢查)JIRA問題。在此期間,您可以這樣做:
tableView.getColumns().get(0).setVisible(false);
tableView.getColumns().get(0).setVisible(true);
這會強制刷新,並且它很快就會發生。在get()方法中使用哪個索引並不重要,因此我總是使用零(0)。之前我重置了整個數據列表並清除了tableView並重置了數據,導致了明顯的閃爍/重繪。上面的setVisible方法並沒有導致這種情況發生,這正是我所希望的。祝你好運。
你可以寫**傑拉門票**號碼/網址? – kingkong 2013-06-05 13:39:31
RT-22463和RT-22599是我遵循的jira門票。 – kpenrose 2013-06-05 17:53:22