【发布时间】:2016-06-05 01:23:31
【问题描述】:
我使用 fx 创建了一个表格视图,它显示来自数据库的信息,每当我搜索数据库并显示结果时,由于某种原因,它会显示检索到的最后一个值乘以找到的结果数量,但它应该做的是显示observableList 中的每一项。我做错了什么?
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import java.util.ArrayList;
/**
* Created by user on 02/06/2016.
*/
public class Main extends Application {
TableView<TableViewData> table;
ObservableList<TableViewData> itemList = FXCollections.observableArrayList();
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("Welcome");
primaryStage.setResizable(false);
TableColumn<TableViewData, String> nameColumn = new TableColumn<>("Name");
nameColumn.setMinWidth(200);
nameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
TableColumn<TableViewData, String> brandColumn = new TableColumn<>("Brand");
nameColumn.setMinWidth(200);
nameColumn.setCellValueFactory(new PropertyValueFactory<>("brand"));
TableColumn<TableViewData, Integer> quantityColumn = new TableColumn<>("Quantity");
nameColumn.setMinWidth(200);
nameColumn.setCellValueFactory(new PropertyValueFactory<>("quantity"));
TableColumn<TableViewData, Double> priceColumn = new TableColumn<>("Price");
nameColumn.setMinWidth(200);
nameColumn.setCellValueFactory(new PropertyValueFactory<>("price"));
TableColumn<TableViewData, String> typeColumn = new TableColumn<>("Type");
nameColumn.setMinWidth(200);
nameColumn.setCellValueFactory(new PropertyValueFactory<>("type"));
table = new TableView<>();
table.getColumns().addAll(nameColumn, quantityColumn, priceColumn, typeColumn, brandColumn);
TextField query = new TextField();
query.setPromptText("Search");
ComboBox column = new ComboBox();
//adds the optons for the combo box
column.getItems().addAll(
"Name",
"Price",
"Item Type",
"Brand",
"Details"
);
Button searchButton = new Button("Search");
searchButton.setOnAction(e -> {
try {
itemList = DatabaseHandling.search(column.getValue().toString(), query.getText());
table.getItems().addAll(itemList);
} catch (Exception ex) {
Errors.error("Please select a an option from the box", "error");
}
});
HBox searchBox = new HBox();
searchBox.getChildren().addAll(query, column, searchButton);
searchBox.setPadding(new Insets(10, 10, 10, 10));
searchBox.setSpacing(10);
Button createItem = new Button("Create");
createItem.setOnAction(e -> MainFunctions.createItem());
Button deleteItem = new Button("Delete");
Button editItem = new Button("Edit");
editItem.setOnAction(e -> MainFunctions.editItem());
HBox itemManipulationBox = new HBox();
itemManipulationBox.getChildren().addAll(createItem, deleteItem, editItem);
itemManipulationBox.setPadding(new Insets(10, 10, 10, 10));
itemManipulationBox.setSpacing(10);
VBox layout = new VBox();
layout.getChildren().addAll(table, searchBox, itemManipulationBox);
Scene scene = new Scene(layout);
primaryStage.setScene(scene);
primaryStage.show();
}
}
这里是搜索按钮调用的搜索函数:
public static ObservableList<TableViewData> search(String column, String query){
String name=null;
String brand = null;
String type=null;
int quantity=0;
double price =0.00;
String newQuery = query.replace(" ","_");
String s = "SELECT * FROM ITEM " +
"WHERE "+column+" LIKE '%"+newQuery+"%';";
Connection con =db_connectionHandler.connect();
ObservableList<TableViewData> items = FXCollections.observableArrayList();
items.clear();
try{
Statement st=con.createStatement();
st.executeUpdate(s);
ResultSet rs=st.executeQuery(s);
while(rs.next()){
items.add(new TableViewData(rs.getString("NAME"),rs.getInt("QUANTITY"),rs.getDouble("PRICE"),rs.getString("TYPE"),rs.getString("BRAND")));
}
for(TableViewData i: items) {
System.out.println();
}
db_connectionHandler.endConnect(con,st,rs);
return items;
}
catch(SQLException e){
System.out.print("error: "+e.getMessage());
}
db_connectionHandler.endConnect(con,null,null);
return items;
}
TableViewData 对象的类:
public class TableViewData {
private static SimpleStringProperty name;
private static SimpleStringProperty brand;
private static int quantity;
private static double price;
private static SimpleStringProperty type;
//constructor for item object
public TableViewData(String Fname, int Fquantity, double Fprice, String Ftype, String Fbrand ){
TableViewData.name=new SimpleStringProperty(Fname);
TableViewData.quantity= new Integer(Fquantity);
TableViewData.price= new Double(Fprice);
TableViewData.type=new SimpleStringProperty(Ftype);
TableViewData.brand=new SimpleStringProperty(Fbrand);
}
public static String getName() {
return name.get();
}
public static void setName(String name) {
TableViewData.name.set(name.replace(" ","_"));
}
public static String getBrand() {
return brand.get();
}
public static void setBrand(String brand) {
TableViewData.brand.set(brand.replace(" ","_"));
}
public static int getQuantity() {
return quantity;
}
public static void setQuantity(int quantity) {
TableViewData.quantity = quantity;
}
public static double getPrice() {
return price;
}
public static void setPrice(double price) {
TableViewData.price = price;
}
public static String getType() {
return type.get();
}
public static void setType(String type) {
TableViewData.type.set(type.replace(" ","_"));
}
}
【问题讨论】:
-
你使用的是静态字段,显然数据都是一样的。这就是静态的意思。摆脱 TableViewData 中的所有静态。
-
将表格更改为非静态并没有改变任何东西,还有其他想法吗?
-
我设法让数组正确存储对象,但是当我显示数组时,它只会显示类型列中的值,但会在第一列中显示它们
-
您拥有使用变量 nameColumn 的所有列。使用正确的变量名。