2016-04-30 11 views
3

Mein Ziel ist es, zu erkennen, wenn ein Benutzer auf eine Zelle im TableView doppelklickt und die Informationen aus dieser Zelle verwendet. Von meinem Bild kann man sehen, dass ich einen Tisch mit Bier, Brauereien und Stil haben werde.So fügen Sie ein click -Ereignis zu einer Tableview-Zelle in javafx hinzu

Mit einem Doppelklick auf eine Zelle möchte ich dem Benutzer ein Bild (des Bieres, einer Brauerei) mit einigen Infos zeigen. Ich benutze auch den Szenengenerator, also habe ich es mit Controller-Klassen zu tun. Soweit habe ich das aber kein Glück. Keine Fehler, zieht einfach nicht die Info, wenn ich einen grundlegenden Test versuche.

FYI: Ich möchte den Klick auf eine Zelle erkennen, und NUR ziehen Informationen aus der Zelle geklickt - nicht die gesamte Zeile.

screenshot of table with beers and breweries

Hier ist mein Code für das Ereignis.

public void clickItem(MouseEvent event) { 
    tableID.setOnMouseClicked(new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent event) { 
      System.out.println("Clicked on " + (tableID.getSelectionModel().getSelectedCells().get(0)).getColumn());   
     } 
    }); 
} 
+1

Meinen Sie, dass Sie die 'println' sehen beim Klicken? Ihre Methode sieht ein bisschen seltsam aus. Könnten Sie das Codefragment auch dort posten, wo es heißt? Und was ist 'tableID'? Es sieht ein bisschen so aus, als wenn Sie auf einen Eintrag klicken, bei dem Sie den Ereignishandler registrieren. – hotzst

+0

Ja, einmal geklickt, sehe ich nicht die Println. Ich habe den Code angepasst aber immer noch kein Glück. Das ist einfach nur die Klick-Funktion zu testen, da ich eine Datenbank verwende, sobald es zwei Klicks erkennt, werde ich Informationen aus der Datenbank in die Java-App ziehen und sie in einem Textbereich anzeigen. – Jonathan

Antwort

5

Wenn Sie Szene Builder & Controller-Klasse verwenden, dann warum Sie verwenden auf dieser Methode setOnMouseClicked? Probieren Sie stattdessen:

@FXML 
public void clickItem(MouseEvent event) 
{ 
    if (event.getClickCount() == 2) //Checking double click 
    { 
     System.out.println(tableID.getSelectionModel().getSelectedItem().getBeer()); 
     System.out.println(tableID.getSelectionModel().getSelectedItem().getBrewery()); 
     System.out.println(tableID.getSelectionModel().getSelectedItem().getCountry()); 
    } 
} 

Um dies zu implementieren, müssen Sie alle Tabellendaten speichern. Erstellen Sie von Ihrer Controller-Klasse zunächst ein Objekt für die Daten jeder Zelle. Schreiben Sie zuerst diese Zeile oben in Ihre Controller-Klasse:

ObservableList<TableData> data = FXCollections.observableArrayList(); 

Fügen Sie dann alle Ihre Tabellendaten mit einer Schleife hinzu. Hier ist ein Beispiel einer Daten zu speichern:

data.add(new TableData("Beer","Brewery","Country")); 

Hier ist die TableData Klasse:

public class TableData 
{ 
    String beer; 
    String brewery; 
    String country; 

    public TableData(String beer, String brewery, String country) 
    { 
     super(); 
     this.beer = beer; 
     this.brewery = brewery; 
     this.country = country; 
    } 

    public String getBeer() 
    { 
     return beer; 
    } 
    public String getBrewery() 
    { 
     return brewery; 
    } 
    public String getCountry() 
    { 
     return country; 
    } 

} 
+0

Ich werde es versuchen, wenn ich zu meinem PC komme und Sie wissen lassen. Und für den Tisch habe ich schon einen konstruierten Dankeschön für die Klasse! – Jonathan

+0

Kein Glück damit, sehe immer noch die println. Ich bin mir nicht sicher, was damit nicht stimmt, dass es nicht gedruckt wird oder die ausgewählte Zelle nicht bekommt. – Jonathan

+0

EDIT *** Ich entschuldige, das funktioniert perfekt. Ich speicherte meine Scenebuilder fxml-Datei an einem anderen Ort und wusste bis jetzt nicht. Vielen Dank! Aber aus Neugier, was würde ich ändern, damit es nur den Biernamenwert zurückgibt, wenn es doppelt geklickt hat. Wenn ich zum Beispiel auf eine andere Spalte klicke, gebe ich den Biernamen zurück, selbst wenn ich unter Brauerei oder Land geklickt habe. Danke – Jonathan

Verwandte Themen