JavaFX TableView / IconView mit MousEvent

missy72

Bekanntes Mitglied
Ich bekomme 1&1 einfach nicht zusammen. Es geht noch mal um mein IconView in der TableView. Dieses habe ich erfolgreich in dem Objekt Fahrer abgelegt und wird auch wie gewünscht in der TableView angezeigt. Zuerst mit dem Bild Ampel_Rot. Dann zu Startzeit ändere ich das Image auf Ampel_Grün. Jetzt möchte ich, dass das IconView klickbar wird. Entsprechende Beispiele aus dem Internet mit einem Button habe ich versucht anzuwenden, aber leider ohne Erfolg, da das Button-Column über den Code erzeugt wurde. Vielleicht kann mit jemand bei meinem Code helfen. Die GUI erstelle ich durch eine FXML-Datei.
Grüße MB

[CODE lang="java" title="Klasse Fahrer Ausschnitt"]public class Fahrer {

private ImageView stopAgainImage;
Image stopAgainRedBild = new Image("data/Icon_Ampel_rot.png");
Image stopAgainGreenBild = new Image("data/Icon_Ampel_gruen.png");

public Fahrer (String vorName, String nachName, String geschlecht, int jahrGang, String mitGlied) {
this.stopAgainImage = new ImageView();
this.stopAgainImage.setImage(stopAgainRedBild);
}

public ImageView getStopAgainImage() {
return stopAgainImage;
}
public void setStopAgainImage(ImageView stopAgainImage) {
this.stopAgainImage = stopAgainImage;
}

public void setStopAgainGreenImage() {
this.stopAgainImage.setImage(stopAgainGreenBild);
}

public void setStopAgainRedImage() {
this.stopAgainImage.setImage(stopAgainRedBild);
}
[/CODE]
[CODE lang="java" title="Klasse ZeitfahrenController Ausschnitt"]@FXML private TableColumn<Fahrer, ImageView> zfStopAgainTC;

zfStopAgainTC.setCellValueFactory(new PropertyValueFactory<>("stopAgainImage"));

zeitfahrListeTV.setItems(mainStarterListe);


tempFahrer.setStopAgainGreenImage();
[/CODE]

[CODE lang="java" title="Fehlversuch Callback"] zfStopAgainTC.setCellValueFactory(new PropertyValueFactory<>("stopAgainImage"));

Callback<TableColumn<Fahrer, Void>, TableCell<Fahrer, Void>> cellFactory = new Callback<TableColumn<Fahrer, Void>, TableCell<Fahrer, Void>>(){
@Override
public TableCell<Fahrer, Void> call(TableColumn<Fahrer, Void> arg0) {
System.out.println("TEST");
return null;
}
};[/CODE]
[CODE lang="java" title="Fehlversuch EventHandler"] zfStopAgainTC.setCellValueFactory(new PropertyValueFactory<>("stopAgainImage"));

for (Fahrer tempFahrer : application.MainModel.mainStarterListe) {

tempFahrer.getStopAgainImage().setOnMouseClicked(new EventHandler<MouseEvent>() {

@Override
public void handle(MouseEvent event) {
System.out.println("Test");

}
});
}[/CODE]

1615145395879.png
 

missy72

Bekanntes Mitglied
Ich bin ein Stück weiter.
Über die Tabelle und den ensprechenden Zeilen habe ich nun Zugriff auf das Objekt und kann mir das ImageView auslesen.
Aber hier kann ich beliebig auf die ganze Zeile klicken, ich möchte aber separat auf das ImageView zugreifen.
Hat nicht jemand eine Idee?

Java:
    @FXML
    void tableMouseClick(MouseEvent event) {
        System.out.println("clicked on " + zeitfahrListeTV.getSelectionModel().getSelectedItem());
    }
 

missy72

Bekanntes Mitglied
Das hat mich wieder viele Jahre meines Lebens gekostet. Hier die Lösung meines Problems.
Die Grafik habe ich komplett aus der Klasse Fahrer entfernt. Hat jetzt nur noch ein Boolean (isFahrerCycling).
Den Code habe ich die Controlleklasse geschrieben. War viel mit tryAndError.
Habe einige Bespiele aus dem Netz zusammengebracht und modifiziert.

Java:
//     zfStopAgainTC.setCellValueFactory(new PropertyValueFactory<>("stopAgainImage"));
//     wird gelöscht und erstzt durch
                       
        zfStopAgainTC.setCellFactory(new Callback<TableColumn<Fahrer,ImageView>, TableCell<Fahrer,ImageView>>() {

            @Override
            public TableCell<Fahrer, ImageView> call(TableColumn<Fahrer, ImageView> parameter) {
                return new TableCell<Fahrer, ImageView>(){
                    
                    ImageView stopAndGoIV = new ImageView();
        
                    {stopAndGoIV.setOnMouseClicked(new EventHandler<MouseEvent>() {

                            @Override
                            public void handle(MouseEvent event) {
                                System.out.println("Klick");       
                            }
                        });
                    }

                    protected void updateItem(ImageView parameterIV, boolean parameterBoolean) {
                        super.updateItem(parameterIV, parameterBoolean);
                        
                        if (parameterBoolean) {                           
                            setGraphic(null);
                        }else {
                            if (parameter.getTableView().getItems().get(getIndex()).isFahrerCycling()) {
                                stopAndGoIV.setImage(stopAgainGreenBild);
                                setGraphic(stopAndGoIV);
                            } else {   
                            
                            stopAndGoIV.setImage(stopAgainRedBild);
                            setGraphic(stopAndGoIV);
                            }
                        }                           
                    }               
                };                   
            }
        });

        zeitfahrListeTV.setItems(application.MainModel.mainStarterListe);
 

missy72

Bekanntes Mitglied
Fragen habe ich aber doch noch.

Wieso wird der EventHandler zusätzlich in geschweiften Klammern geschrieben?
Wenn ich das nicht mache, erkennt er diverse Variable nicht.

Die Einleitung zur Methode habe ich auch nicht vestanden.

Java:
protected void updateItem(ImageView parameterIV, boolean parameterBoolean) {
                        super.updateItem(parameterIV, parameterBoolean);
 

lam_tr

Top Contributor
Fragen habe ich aber doch noch.

Wieso wird der EventHandler zusätzlich in geschweiften Klammern geschrieben?
Wenn ich das nicht mache, erkennt er diverse Variable nicht.

Die Einleitung zur Methode habe ich auch nicht vestanden.

Java:
protected void updateItem(ImageView parameterIV, boolean parameterBoolean) {
                        super.updateItem(parameterIV, parameterBoolean);

Krass, das es so geht, war mir bisher auch nicht klar. Ich kenne es bisher nur mit "static". macht der TableCell eigentlich das was es soll? So wie es aussieht benutzt jede Zeile die gleiche ImageView, ob das so okay ist bin ich mir nicht sicher.
 

missy72

Bekanntes Mitglied
Hat so doch nicht funktioniert. Ich hatte parallel die TableView über @FXML mit einem Handler verknüpft und vergessen. Ich dachte, das wäre das gewünschte Ergebnis. Jetzt habe ich eine wirklich funktionierende Methode, aber leider nicht für ein ImageView, sondern nur über einem Button den ich mit einem Image gefüllt habe.

Alle Fahrer sind gestartet. Fahrer 2 habe ich mit dem MouseClick angehalten (Zieleinlauf). Funktioniert.

1615367535695.png


Java:
zfStopAgainTC.setCellFactory(new Callback<TableColumn<Fahrer,Void>, TableCell<Fahrer,Void>>() {
            @Override
            public TableCell<Fahrer, Void> call(TableColumn<Fahrer, Void> parameter) {
                return new TableCell<Fahrer, Void>(){
                    
                    Button startStopBT = new Button("");
                    ImageView startStopGreenIV = new ImageView(stopAgainGreenBild);
                    ImageView startStopRedIV = new ImageView(stopAgainRedBild);       
                    {
                        startStopBT.setOnMousePressed(new EventHandler<MouseEvent>() {
                            @Override
                            public void handle(MouseEvent event) {
                                
                                Fahrer data = getTableView().getItems().get(getIndex());
                                data.setFahrerCycling(false);                               
                            }
                        });
                    }

                    protected void updateItem(Void parameterIV, boolean parameterBoolean) {
                        super.updateItem(parameterIV, parameterBoolean);
                        
                        if (parameterBoolean) {                           
                            setGraphic(null);                           
                            }else {
                                
                                setGraphic(startStopBT);
                                
                                if (parameter.getTableView().getItems().get(getIndex()).isFahrerCycling()) {
                                    startStopBT.setGraphic(startStopGreenIV);   
                                } else {   
                                
                                    startStopBT.setGraphic(startStopRedIV);
                                }
                            }   
                        }
                    };                                                   
                }
            });
 

missy72

Bekanntes Mitglied
Ja. der Code unter #6 funktioniert so.
Wie schon gesagt, leider nur mit Button und nicht mit ImageView.
Das war auch der Knackpunkt. (glaub ich).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Juelin setzen background color für selected Row im Tableview AWT, Swing, JavaFX & SWT 16
M JavaFX TableView nur erste Zeile editable machen und gelb markieren AWT, Swing, JavaFX & SWT 0
Encera TableView Zeilen als Spalten im SceneBuilder AWT, Swing, JavaFX & SWT 0
T TableView Button onAction AWT, Swing, JavaFX & SWT 3
mrbody234 ArrayList<Message> in eine TableView visualisieren AWT, Swing, JavaFX & SWT 2
izoards JavaFX TableView mit Array Inhalt füllen AWT, Swing, JavaFX & SWT 1
A Mit JavaFX einzelne Zeilen in TableView farbig markieren AWT, Swing, JavaFX & SWT 5
I JavaFX Zellen in Tableview editieren AWT, Swing, JavaFX & SWT 0
A TableView updatet sich nicht AWT, Swing, JavaFX & SWT 3
missy72 JavaFX TableView Spalte zwischen den Zeilen AWT, Swing, JavaFX & SWT 5
W TableView füllen AWT, Swing, JavaFX & SWT 18
missy72 JavaFX Performance / ImageView in TableView über TimeLine AWT, Swing, JavaFX & SWT 1
T TableView aktualisieren AWT, Swing, JavaFX & SWT 1
N JavaFX Tableview nach Löschen von Element falscher Index AWT, Swing, JavaFX & SWT 4
T TableView Zeilen einfärben AWT, Swing, JavaFX & SWT 13
T TableView über Methode befüllen AWT, Swing, JavaFX & SWT 10
missy72 JavaFX TableView / TableColumn / ObservableList / zwei Werte in einer Zelle AWT, Swing, JavaFX & SWT 2
W JavaFX TableView aktualisieren AWT, Swing, JavaFX & SWT 1
S JavaFX - mit Listener Veränderungen in einer TableView abhören AWT, Swing, JavaFX & SWT 3
B JavaFX TableView-Zellen sollen automatisch so groß wie der größte Inhalt sein AWT, Swing, JavaFX & SWT 6
D JavaFX Nullpointerexception wegen TableView AWT, Swing, JavaFX & SWT 2
S Alternative JavaFX TableView AWT, Swing, JavaFX & SWT 1
L JavaFX Tableview row callback AWT, Swing, JavaFX & SWT 0
G Bekomme ResultSet mittels ObservableList nicht ins TableView AWT, Swing, JavaFX & SWT 25
S JavaFX JavaFX TableView scrollen färbt falsche Zeilen AWT, Swing, JavaFX & SWT 1
A checkbox in einer TableView abhängig von einem anderen Celleninhalt disablen AWT, Swing, JavaFX & SWT 1
J JavaFx TableView mit CheckBox AWT, Swing, JavaFX & SWT 4
P JavaFX TableView Zelle markieren AWT, Swing, JavaFX & SWT 3
L JavaFX Tableview Datamodel AWT, Swing, JavaFX & SWT 2
M TableView Zeile hinzufügen AWT, Swing, JavaFX & SWT 5
Bluedaishi TableView mit Combox wert wird nicht in die TableView gesetzt AWT, Swing, JavaFX & SWT 38
J TableView Update/Refresh CPU AWT, Swing, JavaFX & SWT 2
B Text im Tetfeld in einer TableView darstellen AWT, Swing, JavaFX & SWT 20
J Tableview - kann man mit Enter die Zellen wechseln AWT, Swing, JavaFX & SWT 1
ralfb1105 JavaFX Dynamisch TableView Spalten erstellen AWT, Swing, JavaFX & SWT 4
M TableView + Datenbank Aktualisierung AWT, Swing, JavaFX & SWT 4
B TableView als PDF speichern AWT, Swing, JavaFX & SWT 8
B JavaFX TableView eine Zeile markieren AWT, Swing, JavaFX & SWT 5
B JavaFX JavaFX TableView PropertyValueFactory für Werte aus HashMap AWT, Swing, JavaFX & SWT 2
L JavaFX TableView Column Sortierung AWT, Swing, JavaFX & SWT 1
L Java FX Keine Anzeige Im Tableview AWT, Swing, JavaFX & SWT 4
L JavaFX TableView kein content text ändern AWT, Swing, JavaFX & SWT 2
L JavaFX TableView mit Aktionenbuttons AWT, Swing, JavaFX & SWT 1
C JavaFX Edit TableView in Verbindung mit SceneBuilder AWT, Swing, JavaFX & SWT 1
C JavaFX ProGuard -> TableView kein Inhalt AWT, Swing, JavaFX & SWT 7
J SceneBuilder TableView Checkbox AWT, Swing, JavaFX & SWT 1
J JavaFX Elemente werden nicht zu TableView hinzugefügt AWT, Swing, JavaFX & SWT 3
F JavaFX (Tree)TableView korrekt drucken AWT, Swing, JavaFX & SWT 1
robinab JavaFX TableView column resize nach setItems() AWT, Swing, JavaFX & SWT 0
G JavaFX TableView Wert in Spalte ändern AWT, Swing, JavaFX & SWT 0
S JavaFx - ausgewählte Rows in Arraylist (Tableview) AWT, Swing, JavaFX & SWT 4
S JavaFX - Populate TableView AWT, Swing, JavaFX & SWT 2
N JavaFX TableView aus Map AWT, Swing, JavaFX & SWT 2
J TableView Daten werden nicht ausgegeben AWT, Swing, JavaFX & SWT 9
B JavaFX TableView aus Collection befüllen AWT, Swing, JavaFX & SWT 1
S JavaFX TableView einzelne Zelle Layout zuweisen AWT, Swing, JavaFX & SWT 3
zhermann TableView die zweite AWT, Swing, JavaFX & SWT 7
H Java FX List<AlbumsBean> in FXML TableView AWT, Swing, JavaFX & SWT 37
E JavaFX TableView mit Zeilenumbruch in Zellen AWT, Swing, JavaFX & SWT 5
zhermann TableView wird nicht gefüllt AWT, Swing, JavaFX & SWT 14
M JavaFX JavaFX ResultSet in TableView ausgeben AWT, Swing, JavaFX & SWT 2
W JavaFX Mehrere Klassen in ein TableView AWT, Swing, JavaFX & SWT 6
MaxG. JavaFX Inhalt in Tableview wird nicht angezeigt AWT, Swing, JavaFX & SWT 11
M JavaFX berechneten Wert in TableView schreiben AWT, Swing, JavaFX & SWT 1
K JavaFX Message in TableView AWT, Swing, JavaFX & SWT 2
H TableView mit variabler Anzahl Spalten AWT, Swing, JavaFX & SWT 2
L JavaFX List oder TableView Größe dynamisch anpassen? AWT, Swing, JavaFX & SWT 4
L JavaFX TableView mit Excelfunktion AWT, Swing, JavaFX & SWT 1
D JavaFX TableView AWT, Swing, JavaFX & SWT 2
L JavaFX TableView mit XYChart verbinden AWT, Swing, JavaFX & SWT 3
blazingblade JavaFX Tableview Clock Column update AWT, Swing, JavaFX & SWT 5
P JavaFX, TableView und Datenbank AWT, Swing, JavaFX & SWT 4
K TableView: 'Komplexes' Object AWT, Swing, JavaFX & SWT 11
L JavaFX TableView background transparent machen AWT, Swing, JavaFX & SWT 7
F TableCell aus TableView holen AWT, Swing, JavaFX & SWT 8
K JavaFX TableView mit Rectangle AWT, Swing, JavaFX & SWT 3
M Befüllung der einzelnen Zeilen des TableView AWT, Swing, JavaFX & SWT 3
J JavaFX Tableview Daten hinzufügen aus anderer Klasse AWT, Swing, JavaFX & SWT 7
J Tableview Daten hinzufügen und aktualisieren AWT, Swing, JavaFX & SWT 5
N JavaFX TableView füllt nicht das gesamte ScrollPanle aus AWT, Swing, JavaFX & SWT 2
M JavaFX TableView & CSS, Rand um Tabellenkopf entfernen AWT, Swing, JavaFX & SWT 3
L JavaFX ListView oder TableView Style überschreiben? AWT, Swing, JavaFX & SWT 6
G Event Handling TableView daten in ein neues Fenster herauslesen? AWT, Swing, JavaFX & SWT 3
thet1983 JavaFX TableView Objekt Daten anzeige AWT, Swing, JavaFX & SWT 2
J JavaFX TableView - Höhe der Zeilen AWT, Swing, JavaFX & SWT 3
L JavaFX TableView mit Attributs der Modellreferenzerierung für die Spalte AWT, Swing, JavaFX & SWT 3
I JavaFX Buttons und TableView AWT, Swing, JavaFX & SWT 2
J JavaFX Bestimmte Zellen im TableView ändern (Farbe und Text) AWT, Swing, JavaFX & SWT 1
B Java FX TableView Zeilen mit verschiedenen Typen AWT, Swing, JavaFX & SWT 15
Z JavaFX TableView cellValueFactory für Arrays AWT, Swing, JavaFX & SWT 2
E JavaFX TableView mit Rechtsklick Zelle auswählen AWT, Swing, JavaFX & SWT 8
C (JavaFX 8) SQLite Datenbank in einem TableView darstellen AWT, Swing, JavaFX & SWT 2
D JavaFX TableView bleibt leer. AWT, Swing, JavaFX & SWT 8
M JavaFX TableView nach Spalte sortieren AWT, Swing, JavaFX & SWT 1
P JavaFX Dynamische TableView AWT, Swing, JavaFX & SWT 14
V Java FX POJO aus Datenbank in FX TableView / Best Practice AWT, Swing, JavaFX & SWT 0
P JavaFX TableView Item hinzufügen AWT, Swing, JavaFX & SWT 20
W JavaFX TableView frage AWT, Swing, JavaFX & SWT 5
M JavaFX Tutorial zu Tableview AWT, Swing, JavaFX & SWT 5
C JavaFX Zugriff auf TableView AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben