2016-06-05 20 views
1

Ich erstellte eine Tabellenansicht mit fx, die Informationen aus einer Datenbank anzeigt und wann immer ich die Datenbank durchsuchen und die Ergebnisse anzeigen, aus irgendeinem Grund wird es den letzten Wert abgerufen mal die Menge der Ergebnisse, aber was angezeigt Es sollte jedes Element in der observableList angezeigt werden. Was mache ich falsch?JavaFX TableView Anzeige Probleme

enter image description here

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(); 
    } 
} 

Hier ist die Suchfunktion die Suchtaste Anrufe:

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; 
    } 

-Klasse für das TableViewData Objekt:

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(" ","_")); 
    } 
} 
+2

Sie verwenden statische Felder, natürlich werden die Daten alle gleich sein. Das ist was "statisch" bedeutet. In TableViewData werden alle statischen Elemente gelöscht. – brian

+0

Änderung der Tabelle auf nicht statische hat nichts geändert, andere Ideen? – JScott

+0

Ich bekomme, dass das Array die Objekte korrekt speichert, aber wenn ich das Array zeige, zeigt es nur Werte aus der Spalte Typ, aber zeige sie in der ersten Spalte – JScott

Antwort

1

Es gibt zwei Schlüsselfragen hier (wie andere bereits in den Kommentaren identifiziert haben):


Tabelle Gesamte Artikelinformationen nicht angezeigt:

Schauen Sie genau auf Ihren Code hier:

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")); 

Sie ändern nur nameColumn. Sie können dieses Problem beheben, indem Sie die Namen zu ändern, die Codegruppen reflektieren Sie bis
Eg festgelegt haben, wo Sie bis typeColumn gesetzt, sollten Sie die typeColumn Breite werden Einstellung und cellValueFactory, nicht nameColumn, da dies wurde über

Mit diesen getan Änderungen werden Ihre Tabelle wie folgt aussehen:

enter image description here

i verwalten das Array bekommen richtig die Objekte zu speichern, aber wenn i das Array angezeigt wird es nur Wert zeigen s aus der Spalte Typ, aber zeigt sie in der ersten Spalte

Dies war auch aufgrund der nur die nameColumn modifiziert wird, die letzte Änderung war:

nameColumn.setCellValueFactory(new PropertyValueFactory<>("type"));

, die den Anfangswert überschrieben von:

nameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));

Was bedeutet, dass es von 0 wurde bevölstatt name
diesen Schritt folgend auch


duplizierte Zeilen, das Problem beheben soll:

Aus dem letzten Bild werden die Spalten nun bevölkern, aber die Zeilen sind gleich.Dies ist auf die TableViewData Felder als static erklärt werden

Es könnte am besten auf andere Antworten für mehr Klarheit zu lesen, um diese wie:

Mein Versuch, es zu beschreiben (für dieses Szenario) wäre:


Jedes Ihrer Objekte ist nicht länger einzigartig, wenn alle ihre Felder statisch sind . Nach der Erstellung verweisen alle auf denselben Wert. Wenn Sie also eine new Instanz erstellen, wird jede Instanz, die Sie erstellt haben, den Wert dieser Instanz widerspiegeln. Dies ist im obigen Bild sichtbar, da dies der letzte Eintrag war, den ich meiner Liste hinzugefügt habe.

Um dies zu beheben, können Sie:

  1. Entfernen Sie die static Schlüsselwort aus dem Variablendeklarationen
  2. Remove ersetzen TableViewData.someVariableName mit this.someVariableName

this Verwendung innerhalb des Objekts Variablen für eine aussehen Übereinstimmung, die Konflikte verhindert, wenn der Methodenparameter den gleichen Namen hat. Dieser Beitrag sollte Präzisierungen: Using the this Keyword

Mit diesen Änderungen die Tabelle nun in etwa so aussehen:

enter image description here