当前位置: 首页 > 知识库问答 >
问题:

JavaFx 表视图 - 排序为双精度类型的表列字符串类型

彭展
2023-03-14

所以我基本上有表格视图,那里有一些列。其中一列(价格)由字符串组成,实际上表示双精度。唯一的原因是,因为我希望双倍,例如,因为 1 将显示为 1.00。但是正因为如此,我不能正确使用默认排序(排序双精度)。我可以以某种方式更改它,所以当我按下该按钮时,它会将它们排序为双倍类型?

如果需要,请在此处编码:

    import java.text.NumberFormat;
    import java.text.ParseException;
    import javafx.application.Application;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.geometry.Insets;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableView;
    import javafx.scene.control.TextField;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.scene.layout.HBox;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;

    @SuppressWarnings("unused") 
    public class Store_DateBase extends Application {

    Stage window;
    Scene scene;
    Button addButton, deleteButton;
    TableView<Store_Products> table;
    TextField nameInput, priceInput, quantityInput;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        window = primaryStage;
        window.setTitle("Store sortiment!");

        // name column
        TableColumn<Store_Products, String> nameColumn = new TableColumn<>("Name");
        nameColumn.setMinWidth(200);
        nameColumn.setCellValueFactory(new PropertyValueFactory<Store_Products, String>("name"));
        // price column
        TableColumn<Store_Products, String> priceColumn = new TableColumn<>("Price");
        priceColumn.setMinWidth(200);
        priceColumn.setStyle("-fx-alignment: CENTER;");
        priceColumn.setCellValueFactory(new PropertyValueFactory<Store_Products, String>("price"));
        // Quantity column\
        TableColumn<Store_Products, Integer> intColumn = new TableColumn<>("Quantity");
        intColumn.setMinWidth(200);
        intColumn.setStyle("-fx-alignment: CENTER;");
        intColumn.setCellValueFactory(new PropertyValueFactory<Store_Products, Integer>("quantity"));

        // name inputs
        nameInput = new TextField();
        nameInput.setPromptText("Write a name");
        nameInput.setMinWidth(150);
        // price inputs
        priceInput = new TextField();
        priceInput.setPromptText("Write a price");
        priceInput.setMinWidth(100);
        //quantityInputs
        quantityInput = new TextField();
        quantityInput.setPromptText("Write a quantity");
        quantityInput.setMinWidth(100);

        // buttons
        addButton = new Button("Add");
        addButton.setOnAction(e -> addMeth());

        deleteButton = new Button("Delete");
        deleteButton.setOnAction(e -> deleteMeth());


        HBox hBox = new HBox();
        hBox.setPadding(new Insets(10, 10, 10, 10));
        hBox.setSpacing(10);
        hBox.getChildren().addAll(nameInput, priceInput, quantityInput, addButton, deleteButton);

        table = new TableView<>();
        table.setItems(getProduct());
        table.getColumns().addAll(nameColumn, priceColumn, intColumn);

        VBox layout = new VBox(10);
        layout.setPadding(new Insets(20, 20, 20, 20));
        layout.getChildren().addAll(table, hBox);

        scene = new Scene(layout);
        window.setScene(scene);
        window.show();
    }

    // delete button clicked
    private void deleteMeth() {
        ObservableList<Store_Products> productSelected, allProducts;
        allProducts = table.getItems();
        productSelected = table.getSelectionModel().getSelectedItems();
        // for all products what are selected remove them from table.
        productSelected.forEach(allProducts::remove);
    }

    // add button clicked
    private void addMeth() {
        Store_Products produkts = new Store_Products();
        // get name
        produkts.setName(nameInput.getText());
        // get price
        double price = PriceValue(produkts);
        if (price != 0)
            produkts.setPrice(price);
        else
            return;
        // get quantity
        int quantity = QuantityValue(produkts);
        if (quantity != 0)
            produkts.setQuantity(quantity);
        else
            return;
        // add to the table
        table.getItems().add(produkts);
        // clear what is written after push "addButton"
        nameInput.clear();
        priceInput.clear();
        quantityInput.clear();
    }

    private double PriceValue(Store_Products price) {
        try {
            String value = priceInput.getText().replaceAll(",", ".");
            double doubleValue = Double.parseDouble(value);
            return doubleValue;
        } catch (Exception e) {
            return 0;
        }

    }

    private int QuantityValue(Store_Products quantity) {
        try {
            int value = Integer.parseInt(quantityInput.getText());
            return value;
        } catch (Exception e) {
            return 0;
        }

    }

    // get default products
    public ObservableList<Store_Products> getProduct() {
        ObservableList<Store_Products> products = FXCollections.observableArrayList();
        products.add(new Store_Products("Laptop", 850.00, 27));
        products.add(new Store_Products("Desktop computer", 499.99, 66));
        products.add(new Store_Products("Proccesor", 50.00, 55));
        products.add(new Store_Products("Screen", 119.99, 22));
        products.add(new Store_Products("keyboard", 20.00, 270));
        products.add(new Store_Products("mouse", 16.99, 60));
        products.add(new Store_Products("mic", 5.90, 101));
        return products;
    }

}

共有1个答案

濮阳研
2023-03-14

使列成为< code>TableColumn

TableColumn<StoreProduct, Number> priceColumn = new TableColumn<>("Price");
// may need to update the properties in StoreProduct to have the correct type
// (but likely will be more convenient anyway)
priceColumn.setCellValueFactory(new PropertyValueFactory<>("price"));
priceColumn.setCellFactory(tc -> new TableCell<StoreProduct, Number>() {
    @Override
    protected void updateItem(Number price, boolean empty) {
        if (empty) {
            setText("");
        } else {
            setText(String.format("%.2f", price.doubleValue()));
        }
    }
});

这将适用于,例如。

public class StoreProduct {

    private final DoubleProperty price = new SimpleDoubleProperty() ;

    public DoubleProperty priceProperty() {
        return price ;
    }

    public final double getPrice() {
        return priceProperty().get();
    }

    public final void setPrice(double price) {
        priceProperty().set(price);
    }

    // other properties...
}
 类似资料:
  • 我的应用程序中有一个ListView,我想对条目进行排序。我还希望列表自动排序,如果一个新的条目被添加。 为此,我使用sortedlist。Java API表示“ObservableList中的所有更改都会立即传播到SortedList中”。

  • 我是一名Java初学者,我正在基于Stackowerflow上的一个示例构建一个简单的购物清单程序: 使用用户输入将对象添加到ArrayList的方法 用户输入(名称价格)将商品添加到购物清单中。 现在我希望输出显示通过使用即可比按价格(上升)排序的对象,但不知道如何将其添加到代码中。我真的是个初学者,所以我希望我写的东西有意义。 非常感谢。 代码如下:

  • 问题内容: 在这一点上,这已经是一个老问题了,我可能已经阅读了有关SO的所有相关主题。 但是要点。我需要一些建议或更正吗? 出于某种原因,我们有两种可生成的Jsons: 和 对象和数组。还有其他参数,但在这里无关紧要。每个请求的“ id”都不同。有时是userId,PortfolioId等。因此我得到“ id”并将其传递给相关的var。 很长一段时间我一直在处理第一种情况。并这样创建POJO: 数

  • 问题内容: 我有一个双,其值是10,000,000.00(千万)。我必须将其转换为。当使用该方法时,我会得到 “ 1.0E7”,它遵循规范是正确的。不幸的是,我需要“ 10,000,000.00”(或等价的语言,具体取决于语言环境)。 如何做到这一点? 问题答案: 尝试之一 NumberFormat http://java.sun.com/javase/6/docs/api/java/text/N

  • 问题内容: 给定python字符串列表,如何自动将其转换为正确的类型?意思是,如果我有: 我希望将其转换为列表 其中第一个元素是stuntng,第二个元素是int,第三个元素是float,第四个元素是int。 我怎样才能做到这一点?谢谢。 问题答案: import ast

  • 方法(下面)是一个类型,我用作参数的类是一个。我想知道我选角的方式是否管用: 这就是方法: 此URL指向类: 我把它放进了粘贴箱,因为课程太长了。