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

无法从String起着转换到观察值java/javafx

东方高洁
2023-03-14

我在Java中得到了以下错误消息:“无法从<code>StringProperty</code>转换为<code>ObservableValue

我正在使用TableView,并希望在TableColumn中添加数据。我有三个图表,它们都应该包含类产品的一个属性(名称、数量、价格)。

我在这一行中得到了错误:

sname.setCellValueFactory(cellData -> cellData.getValue().

相关代码:

import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.util.Callback;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableColumn.CellEditEvent;

public class ViewShop extends BorderPane {

    private Button add;
    private Button remove;
    private TextField name;
    private TextField price;
    private TextField count;
    private VBox vbox;
    private HBox hbox;
    private TableView tv;
    private TableColumn<Product, SimpleDoubleProperty> sprice;
    private TableColumn<Product, SimpleStringProperty> sname;
    private TableColumn <Product, SimpleIntegerProperty>scount;
    private Label namelabel;
    private Label pricelabel;
    private Label countlabel;

    private ListView<fpt.com.Product> list; 

    public ViewShop()
    {

        remove=new Button("Remove");
        add=new Button("Add");
        name=new TextField();
        price=new TextField();
        count=new TextField();
        tv=new TableView<fpt.com.Product>();
        sprice=new TableColumn<>("Preis");
        sname= new TableColumn<>("Name");
        scount=new TableColumn<>("Anzahl");
        namelabel=new Label("Name");
        pricelabel=new Label("Preis");
        countlabel=new Label("Anzahl");
        tv.getColumns().addAll(sname,sprice,scount);
        hbox=new HBox();
        vbox=new VBox();
        list = new ListView<fpt.com.Product>();
//      
//       sname.setCellValueFactory(new Callback<CellDataFeatures<Product, SimpleStringProperty>, ObservableValue<SimpleStringProperty>>() {
//           public ObservableValue<SimpleStringProperty> call(CellDataFeatures<Product, SimpleStringProperty> p) {
//               // p.getValue() returns the Person instance for a particular TableView row
//               return  p.getValue().nameProperty();
//               
//                       }
//        });
        sname.setCellValueFactory(cellData -> cellData.getValue().nameProperty());
        hbox.getChildren().addAll(remove, add);
        vbox.getChildren().addAll(namelabel,name,pricelabel ,price, countlabel , count, hbox);
        this.setRight(vbox);
        this.setLeft(tv);
    }
    public void addEventHandleradd(EventHandler<ActionEvent> eventHandler) {
        this.add.addEventHandler(ActionEvent.ACTION, eventHandler);
    }
    public void addEventHandlerremove(EventHandler<ActionEvent> eventHandler) {
        this.remove.addEventHandler(ActionEvent.ACTION, eventHandler);
    }
    public String giveName()
    {
        return name.getText();
    }
    public String givePrice()
    {
        return price.getText();
    }
    public String giveCount()
    {
        return count.getText();
    }
    public ListView<fpt.com.Product> getList()
    {
        return list;
    }


}

import javafx.beans.property.StringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.InvalidationListener;
import javafx.beans.property.DoubleProperty;

public class Product implements fpt.com.Product {

    Long id;
    SimpleStringProperty name;
    SimpleIntegerProperty quantity;
    SimpleDoubleProperty price;

    public Product(String name, int quantity, double price)
    {
        this.name=new SimpleStringProperty(name);
        this.quantity=new SimpleIntegerProperty(quantity);
        this.price=new SimpleDoubleProperty(price);
    }




    @Override
    public long getId() {
        return id;
    }

    @Override
    public void setId(long id) {
        this.id=id;

    }

    @Override
    public double getPrice() {
        return this.price.get();
    }

    @Override
    public void setPrice(double price) {
        this.price.set(price);
    }

    @Override
    public int getQuantity() {
        return this.quantity.get();
    }

    @Override
    public void setQuantity(int quantity) {
        this.quantity.set(quantity);
    }

    @Override
    public String getName() {
        return this.name.get();
    }

    @Override
    public void setName(String name) {
        this.name.set(name);
    }

    @Override
    public StringProperty nameProperty() {
        return name;
    }

    @Override
    public DoubleProperty priceProperty() {
        return price;
    }

    @Override
    public IntegerProperty quantityProperty() {
        return quantity;
    }

}

共有1个答案

金飞翼
2023-03-14

您的表格列的类型是错误的。他们应该是

private TableColumn<Product, Number> sprice;
private TableColumn<Product, String> sname;
private TableColumn <Product, Number> scount;
 类似资料:
  • 问题内容: 给定汽车清单(),我可以这样做: 有没有办法我可以从一个到一个序列? 像没有参数的东西 问题答案: 您可以这样映射到: 请注意,flatMapping可能不会保留源可观察的顺序。如果订单对您很重要,请使用。

  • 我已经创建getByBusinessDeviceID()方法和返回观察,但我想投观察列表。 公共观察getByBusinessDeviceID(整数id){Criteria cr=get会话(). createCriteria(Observation.class);cr.add(Restrictions.eq("business_device_id", id));cr.add(Order.desc

  • 我正在从ViewModel中的Dialog片段更新LiveData值,但无法获取片段中的值。 视图模型: BaseViewModel: 对话框片段: 我从DialogFragment的xml文件中调用viewmodel的resendOTP(contactId:String)方法: 现在,每当我尝试从片段中调用resendOTP响应LiveData时,它都不会被调用: 所以我在这里做错了什么。 编辑

  • 我试图运行Spring Cloud Sleuth并观察traceid,spantid oin日志。 我的配置如下,但当我调用requesti cnat时,会在日志中看到任何traceId或logId。 有人帮忙吗。谢谢 build.gradle Controller.java

  • 问题内容: 我正在尝试将项目设置为表视图,但是setitems方法需要一个可观察的列表,而我的模型中却有一个可观察的集合.FXCollections实用程序类没有给定可观察的集合来创建可观察的列表的方法。类强制转换异常(按预期)。 目前,我正在使用这种代码 而且我有一些问题: 在表中进行编辑是否会按预期更新基础集? 这是这样做的“正确”方法吗 简而言之,我需要样式指南或最佳做法,以便在可观察集和可

  • 问题内容: 我正在从String变量的Restful api获取数据,现在我想转换为JSON对象,但是在转换时会引发异常,这是我的问题。这是我的代码: 我的字符串包含 这是我想要在json中使用的字符串,但它向我显示了线程“ main”中的异常 问题答案: 的是本内的。您需要按层次分析JSON,以便能够正确获取数据。 注意:本示例使用类而不是。 正如“ Matthew”在他正在使用的注释中提到的那