我似乎无法为此找到解决方案,并且是 java/javafx 的新手:
我有一个 3 列的 tableview ,最后一列是价格列。每当从表格视图中添加或删除一行时,我想显示价格列的运行总计。
TableView 由一个 ObservableList 填充,它每行包含一个 3 个字段对象。String id,String product, Double price.........这是我想在单独的 textField 中保持运行总计的价格
我似乎无法为此找到解决方案,并且是 java/javafx 的新手:
我有一个 3 列的 tableview ,最后一列是价格列。每当从表格视图中添加或删除一行时,我想显示价格列的运行总计。
TableView 由一个 ObservableList 填充,它每行包含一个 3 个字段对象。String id,String product, Double price.........这是我想在单独的 textField 中保持运行总计的价格
由于 tableview 的项目是 ObservableList,你可以跟踪 ListChangeListener,并更新计算的总价格:
public class Sample extends Application
{
@Override
public void start( Stage primaryStage )
{
// items set to tableview
ObservableList<Product> products = FXCollections.observableArrayList();
DoubleProperty totalProperty = new SimpleDoubleProperty( 0 );
products.addListener(( ListChangeListener.Change<? extends Product> change ) ->
{
while ( change.next() )
{
if ( change.wasAdded() )
{
for ( Product p : change.getAddedSubList() )
{
totalProperty.set( totalProperty.get() + p.getPrice() );
}
}
else if ( change.wasRemoved() )
{
for ( Product p : change.getRemoved() )
{
totalProperty.set( totalProperty.get() - p.getPrice() );
}
}
}
});
TextField textField = new TextField();
textField.textProperty().bind( totalProperty.asString() );
Random random = new Random();
Button btnAdd = new Button( "Add product" );
btnAdd.setOnAction( ( ActionEvent event ) ->
{
products.add( new Product( "new", ( double ) random.nextInt( 100 ) ) );
} );
Button btnRemove = new Button( "Remove product" );
btnRemove.setOnAction( ( ActionEvent event ) ->
{
if ( products.size() > 0 )
{
products.remove( random.nextInt( products.size() ) );
}
} );
VBox root = new VBox();
root.getChildren().addAll( textField, btnAdd, btnRemove );
Scene scene = new Scene( root, 300, 250 );
primaryStage.setScene( scene );
primaryStage.show();
}
public static class Product
{
String name;
Double price;
public Product( String name, Double price )
{
this.name = name;
this.price = price;
}
public String getName()
{
return name;
}
public void setName( String name )
{
this.name = name;
}
public Double getPrice()
{
return price;
}
public void setPrice( Double price )
{
this.price = price;
}
}
public static void main( String[] args )
{
launch( args );
}
}