[英]Editing numbers in javafx TableView cells
我正在為朋友制作一個相當復雜的桌面應用程序,作為學習Java的一種方式,特別是Java 8和JavaFX。 該應用程序將具有大量表格,並且像高度特定的電子表格一樣工作,並且與估算運輸成本有關。 到目前為止,我已經學會了使用Scene Builder,並使用css結構,並設計了自己的類來表示表中的數據。 這是我的Vessel類的簡化版本:
import javafx.beans.property.*;
public class Vessel
{
private StringProperty name;
private FloatProperty deadWeight;
public Vessel(){
this.name = new SimpleStringProperty("ENTER SHIP NAME");
this.deadWeight = new SimpleFloatProperty(0);
}
public Vessel(String name, float deadWeight){
this.name = new SimpleStringProperty(name);
}
public void setName(String name){this.name.set(name);}
public void setDeadWeight(float deadWeight){this.deadWeight.set(deadWeight);}
public String getName(){
if ( !(name.get().equals("")) || (name.get()==null) || (name.get().trim().equals("ENTER SHIP NAME")) )
return name.get();
return null;
}
public float getDeadWeight(){return deadWeight.get();}
public StringProperty nameProperty() { return name;}
public FloatProperty deadWeightProperty() { return deadWeight;}
public void clear(){
this.name.set("ENTER SHIP NAME");
this.deadWeight.set(0);
}
}
我需要直接編輯TableView中的單元格,它們是浮點數或字符串。 我可以使用字符串,從我在這個網站上收集的信息,但無法弄清楚如何做浮動。
這是控制器文件VesselController.java:
import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.AnchorPane;
import javafx.beans.property.SimpleFloatProperty;
import javafx.beans.value.*;
import javafx.scene.control.TreeTableColumn.CellDataFeatures;
public class VesselController {
@FXML private AnchorPane root;
@FXML private TableView<Vessel> vesselTable;
@FXML private TableColumn<Vessel, String> vesselTableNameCol;
@FXML private TableColumn<Vessel, Number> vesselTableDWTCol;
// Reference to the main application.
private MyMain mainApp;
//The constructor, it is called before the initialize() method.
public VesselController() {}
//Initializes the controller class. This method is automatically called after the fxml file has been loaded.
@FXML
private void initialize() {
// Initialize the vessel table with the columns.
vesselTableNameCol.setCellValueFactory(cellData -> cellData.getValue().nameProperty());
vesselTableNameCol.setCellFactory(column -> EditCell.createStringEditCell());
vesselTableDWTCol.setCellValueFactory(cellData -> cellData.getValue().deadWeightProperty());
// vesselTableDWTCol.setCellFactory(column -> EditCell.createStringEditCell()); //not working, as it needs to reurn a SimpleFloatProperty type
//so tried this, but don't have a clear idea of what I'm doing
vesselTableDWTCol.setCellValueFactory(new Callback<CellDataFeatures<Vessel, Number>, ObservableValue<Number>>() {
@Override
public ObservableValue<Number> call(CellDataFeatures<Vessel, Number> p) {
return new SimpleFloatProperty(p.getValue().deadWeightProprerty());
}
});
}
//Is called by the main application to give a reference back to itself.
public void setMainApp(MyMain mainApp) {
this.mainApp = mainApp;
vesselTable.setItems(mainApp.getVesselData()); // Add observable list data to the table
vesselTable.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
vesselTable.setEditable(true);
}
}
這是顯示錯誤的類,我不知道為什么 - 我需要實現回調嗎? 如果是這樣,我該怎么做? 我從這篇文章中收集了一些代碼,試圖讓它與Numbers一起使用。 我從James_D的存儲庫下載的EditCell類。
以下是運行它的MyMain.java:
import java.io.*;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.*;
import javafx.stage.Stage;
import javafx.collections.ObservableList;
import javafx.collections.FXCollections;
public class MyMain extends Application {
private Stage primaryStage;
//The data as an observable list of Persons.
private ObservableList<Vessel> vesselData = FXCollections.observableArrayList();
//Constructor
public MyMain() { // Add some sample data
vesselData.add(new Vessel()); //init empty row
}
// Returns the data as an observable list of Vessels (in this case a single row)
public ObservableList<Vessel> getVesselData() { return vesselData; }
// Shows the vessel overview inside the root layout.
@Override
public void start(Stage primaryStage) {
this.primaryStage = primaryStage;
this.primaryStage.setTitle("My Vessel");
show();
}
//Initializes the root layout.
public void show() {
try {
FXMLLoader loader = new FXMLLoader(); // Load root layout from fxml file.
loader.setLocation(MyMain.class.getResource("MyUI.fxml"));
AnchorPane root = (AnchorPane) loader.load();
// Give the controller access to the main app.
VesselController controller = loader.getController();
controller.setMainApp(this);
// Show the scene containing the root layout.
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
} catch (IOException e) { e.printStackTrace();}
}
// Returns the main stage.
public Stage getPrimaryStage() {
return primaryStage;
}
public static void main(String[] args) {
Application.launch(MyMain.class, (java.lang.String[])null);
}
}
我很確定我需要修改EditCell類,並且我試圖創建我自己的“NumberConverter”而沒有任何運氣 - 我不完全理解泛化,但我很確定我需要去那個路徑由於應用程序的總體最終復雜性。 為這么長的帖子道歉。
如果有人能提供一些很棒的指導。
我認為你不需要使用EditCell
類。 或者,您可以使用TextFieldTableCell類。 您需要為vesselTableDWTCol
列調用setcellfactory(...)
方法(您可以使用vesselTableNameCol
列執行相同的vesselTableNameCol
)。
使用以下代碼段:
// this line allow you to edit cells in `vesselTableNameCol` column
vesselTableNameCol.setCellFactory(TextFieldTableCell.forTableColumn());
// this line allow you to edit cells in `vesselTableDWTCol` column
vesselTableDWTCol.setCellFactory(TextFieldTableCell.forTableColumn(new FloatStringConverter()));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.