2013-03-19 38 views
0

我正在使用Hibernate和JavaFx。我想要做的是更改一個元素(行)並在更改後刷新它。如何在TableView上刷新數據變化中的單行

不想刷新所有元素(因爲我發現它在教程中),我不能使用SimpleStringProperty,因爲它可能在JPA映射文件中使用它。

我試着刪除並添加相同的元素 - 元素被刪除,但不是再次添加。

請幫忙。

回答

0
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); } 

} 
0

我開始使用TableView綁定到數據庫表時遇到了同樣的問題。我會更新一個對象的數據,該對象顯示在表的一行中,並且由於數據結構是一個ObservableList,我希望數據可以自動刷新。不會發生,並且有一個開放的(最後我檢查)JIRA問題。在此期間,您可以這樣做:

   tableView.getColumns().get(0).setVisible(false); 
       tableView.getColumns().get(0).setVisible(true); 

這會強制刷新,並且它很快就會發生。在get()方法中使用哪個索引並不重要,因此我總是使用零(0)。之前我重置了整個數據列表並清除了tableView並重置了數據,導致了明顯的閃爍/重繪。上面的setVisible方法並沒有導致這種情況發生,這正是我所希望的。祝你好運。

+0

你可以寫**傑拉門票**號碼/網址? – kingkong 2013-06-05 13:39:31

+0

RT-22463和RT-22599是我遵循的jira門票。 – kpenrose 2013-06-05 17:53:22