JavaFX Zusammenzählen einer TableColumn

Faru12

Mitglied
Hallo zusammen,

Ich habe ein kleines Problem mit Javafx 8, bei dem ich einfach nicht weiterkomme...

Und zwar wähle ich mittels Comboboxen Früchte und deren Anzahl aus. Diese werden dann in eine Tabelle geschrieben.

Bspw. so
Apfel 5
Birnen 3
Apfel 2
Bananen 1

Ich möchte das Total pro Frucht in eine separate Tabelle schreiben. Das Einschreiben der Frucht in die andere / neue Tabelle habe ich mal. Das zusammenzählen der Werte klappt aber leider nicht. :shock: Kann mir da jemand evtl. helfen?

Vielen Dank


Aufbau meines Codes:
Java:
public class Fruits implements Initializable {

	// Tabellen und Spalten
    @FXML TableView<DataClass> fruitlist;
    @FXML TableColumn<DataClass, String> fruits;
    @FXML TableColumn<DataClass, Integer> qty;
    
    @FXML TableView<FruitClass> früchteliste;
    @FXML TableColumn<FruitClass, String> früchteSpalte;
    @FXML TableColumn<FruitClass, Integer> früchteAnzahl;
    
    // Button und Combobox
    @FXML Button addfruit;
    @FXML ComboBox<Integer> qty_combobox;
    @FXML ComboBox<String> fruits_combolist;
    
    // ObservableList
    ObservableList<DataClass> data;
    ObservableList<FruitClass> fruchtliste;
     
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        fruits.setCellValueFactory(new PropertyValueFactory<DataClass,String>("rfruits"));
        früchteSpalte.setCellValueFactory(new PropertyValueFactory<FruitClass, String>("rfrüchte"));
        früchteAnzahl.setCellValueFactory(new PropertyValueFactory<FruitClass, Integer>("rfrüchteanzahl"));
        qty.setCellValueFactory(new PropertyValueFactory<DataClass, Integer>("rqty"));
       
        data = FXCollections.observableArrayList();
        fruchtliste = FXCollections.observableArrayList();
     
        fruitlist.setItems(data);
        früchteliste.setItems(fruchtliste);
        
        // Setzen der Combobox Werte
        qty_combobox.getItems().clear();
        qty_combobox.getItems().addAll(0,1,2,3,4,5,6,7,8,9,
        		10,11,12,13,14,15,16,17,18,19,
        		20,21,22,23,24,25,26,27,28,29,30);
        
        fruits_combolist.getItems().clear();
        fruits_combolist.getItems().addAll("Apfel","Birnen","Bananen");
        
       }    
    
    // Event bei ButtonKlick
    @FXML
    private void handleButtonAction(ActionEvent event) {
    	
    		DataClass fruitline = new DataClass(); 
            fruitline.fruitdata.setValue(fruits_combolist.getValue());
            fruitline.qtydata.setValue(qty_combobox.getValue());
            data.add(fruitline);
            neueFruchtinListe();
    	}
    
  // Setzen der Frucht in Liste
    private String neueFruchtinListe() {
    	String frucht = null;
    	int n = 0;
    	for(int i = 0; i < fruchtliste.size(); i++) {
    		if(früchteSpalte.getCellData(i).equals(fruits_combolist.getValue())) {
    			n = n+1;
    		}
    		else {
    			n = n+0;
    		}
    	}
    	if(n<1) {
    		frucht = fruits_combolist.getValue();
    		FruitClass neueFrucht = new FruitClass();
    		neueFrucht.fruitdata.setValue(frucht);
    		fruchtliste.add(neueFrucht);
    	}
    	return frucht;
    }
 }

DataClass

Java:
public class DataClass {
	
	 	public SimpleStringProperty fruitdata = new SimpleStringProperty();
	    public SimpleIntegerProperty qtydata = new SimpleIntegerProperty();
	    
	    public Integer getRqty() {
	    	return qtydata.get();
	    }
	    
	    public String getRfruits() {
	        return fruitdata.get();
	    }
}

FruitClass

Java:
public class FruitClass {
	
	public SimpleStringProperty fruitdata = new SimpleStringProperty();
	public SimpleIntegerProperty fruitcount = new SimpleIntegerProperty();
	
	  public String getRfrüchte() {
	        return fruitdata.get();
	  }
	  
	  public Integer getRfrüchteanzahl() {
		  return fruitcount.get();
	  }
}
 
Ich würde ja gern helfen, aber im Moment habe ich das Problem, dass ich deinen Workflow nicht verstehe. Was wird nun wo ausgewählt und wo angezeigt??? Kannst du vielleicht mal einen Screenshot anhängen? Wenn ich verstehe, was dein Workflow ist, komm ich vielleicht auch darauf, was eigentlich dein Problem ist...

BTW: Auch dein Programmierstil verwirrt mich gerade etwas.
 
Hallo,

Ich habe einen Screenshot angehängt. Kurz zur Erklärung:
Bei 1. können die Früchte / Anzahl ausgewählt werden. Mit Klick auf Hinzufügen werden der Name und die Anzahl in die Tabelle (Punkt 2) übertragen. und bei 3 sollte die Summe pro Frucht dargestellt werden. Im Beispiel des Screenshots also: Apfel: 8, Birnen: 6, Bananen 24 (dorf wo jetzt noch 0en stehen).

BTW: Auch dein Programmierstil verwirrt mich gerade etwas.

Ich bin blutiger Anfänger :bahnhof: und über jedwede Hilfe / Anmerkung dankbar. Was könnte ich daran verbessern, resp. was verwirrt dich?
 

Anhänge

Nur kurz zum Code-Stil (wie ich ihn meist verwende):
"normale" Variablen:
Java:
private int value = myValue;
statische Variablen (alle Objekte dieser Klasse teilen sich diesen Wert - wird er an einer Stelle geändert, ändert er sich für alle Objekte), der Unterstrich ist hierbei allerdings Geschmackssache:
Java:
private static int value = my_value;
Konstate (also ein unveränderlicher Wert):
Java:
private static final int value = MY_VALUE;

Verwende sprechende Bezeichner - "qty" erschliesst sich zwar aus dem Kontext, aber verwende doch einfach "quantity".

Vermeide. wo möglich, denglisch. Ich persönlich (aber das ist wirklich meine Meinung!) empfinde so etwas wie getFrüchte einfach als Beleidigung für meine Augen.

getter (also wie man einen Wert aus einem Modellobjekt ausliest):
Java:
// Deine Variante ist etwas schräg.
// public String getRfrüchte() {...}

//  Die Konvention ist:
public String getFrüchte() {...}

Es bietet sich generell an, die Schreibweise für Getter und Setter <get|set>Variable zu verwenden, da einige Bibliotheken genau diese Schreibweise erwarten und versuchen Daten per Reflection (bitte hierzu mal Google fragen) auszulesen.
JavaFX erwartet zum Beispiel stellenweise noch drei Methode pro Variable:
Java:
public class Data {
    
        public SimpleStringProperty fruit = new SimpleStringProperty();
        public SimpleIntegerProperty quantity = new SimpleIntegerProperty();
        
        public Integer getQuantity() {
            return quantity.get();
        }

        public void setQuantity(Integer value) {
            return quantity.set(value);
        }

        public SimpleIntegerProperty quantityProperty() {
            return quantity;
        }
        
        // das Selbe für "fruit"
}

...und: Verwende setter und nicht public-Variablen (das musst du eigentlich nur in Performance-kritischen Umgebungen tun, selten im "normalen" Betrieb).
 
Zuletzt bearbeitet:
Zu deinem Implementierungsproblem:
Wenn deine Anwendungg (was die Früchteauswahl angeht) so bleibt, also statisch ist, warum schreibst du nicht einfach die Werte rechts daneben in ein Label?

Ansonsten verwende JavaFX-Bindings: Hänge einen onChangeListener an die Liste für die erste Tabelle, die die Daten der zweiten anpasst, dann musst du nicht explizit jedes mal die Methode aufrufen.

Dein Grundsätzliches Problem aber dürfte hier die von mir im anderen Post genannte dritte Methode für deine Daten sein: [c]public SimpleIntegerProperty quantityProperty() {return quantity;}[/c]. Die PropertyValueFactory bekommt so wahrscheinlich schlicht nicht mit, wenn sich die Daten geändert haben.
 
Verwende sprechende Bezeichner - "qty" erschliesst sich zwar aus dem Kontext, aber verwende doch einfach "quantity".

Vermeide. wo möglich, denglisch. Ich persönlich (aber das ist wirklich meine Meinung!) empfinde so etwas wie getFrüchte einfach als Beleidigung für meine Augen.

Gebe ich dir vollkommen recht. Die Bezeichnungen sindnicht gerade wirklich toll... :bloed:

Mit der getter / setter Methode und setValue habe ich das ganze dann geschafft!

Vielen Dank für deine Hilfe!
 

Zurück
Oben