JavaFX TableView mit Rechtsklick Zelle auswählen

expensne

Mitglied
Guten Morgen,

habe ein kleines Problem mit der TableView, ich möchte das wenn man mit Rechtsklick auf eine Zelle klickt, der Inhalt in's Clipboard geladen wird.

Das funktioniert aber nur unter der Bedigung, dass die Zeile, in der sich die Zelle befindet die man kopieren möchte, nicht schon markiert ist.
Anders ausgedrückt, ich kann nicht zwei Zellen nacheinander aus einer Zeile kopieren.

Ein erneuter Rechtsklick in einer markierten Zeile führt nicht zu einer anderen Spalte (p.getColumn()) bei:

Java:
table.setOnMouseClicked(new EventHandler<MouseEvent>() {
  @Override
  public void handle(MouseEvent event) {
    if (event.getButton().equals(MouseButton.SECONDARY) ) {
      @SuppressWarnings("rawtypes")
      ObservableList<TablePosition> cells = table.getSelectionModel().getSelectedCells();
      for (@SuppressWarnings("rawtypes") TablePosition p : cells) {					
        int r = p.getRow();
        int c = p.getColumn();
        Object cell = table.getColumns().get(c).getCellData(r);
        System.err.println(r + " " + c);
      }						
    }
  }
});


Es kommt nur zu einer neuen Spalte, wenn ich zuerst in eine andere Zeile gehe und dann wieder zurück in die gewünschte Zeile auf die Zelle rechtsklicke.
Jemand eine Idee? :rtfm:

Gruß
Fabian
 
Zuletzt bearbeitet von einem Moderator:
Also ich kann jetzt aus den Versuchen, die ich mit deinem Code gemacht habe sagen, dass es einwandfrei funktioniert (Java 8u40).
 
Also ich kann jetzt aus den Versuchen, die ich mit deinem Code gemacht habe sagen, dass es einwandfrei funktioniert (Java 8u40).

Habe auch Version 8u40, habe jetzt auch mal einen seperaten Test gemacht.
Neues Projekt nur mit einer Tabelle (Code s. unten). Problem tritt immer noch auf.

Und hier ein Video zu dem Problem:
[video]https://youtu.be/BAhxOpK93Rc[/video]

Wenn ich in der bereits ausgewählten Zeile auf eine andere Zelle rechtsklicke, wird immer nur die ausgegeben, die man als erstes angeklickt hatte.

Java:
public class Main extends Application {
	@SuppressWarnings("unchecked")
	@Override
	public void start(Stage primaryStage) {
		try {
			BorderPane root = new BorderPane();
			Scene scene = new Scene(root, 400, 400);
			scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());

			primaryStage.setScene(scene);

			// TABLE
			ObservableList<Daten> olDaten = FXCollections.observableArrayList();
			TableView<Daten> table = new TableView<Daten>();

			TableColumn<Daten, String> accountCol = new TableColumn<Daten, String>("Spalte1");
			accountCol.setCellValueFactory(new PropertyValueFactory<Daten, String>("account"));

			TableColumn<Daten, String> loginCol = new TableColumn<Daten, String>("Spalte2");
			loginCol.setCellValueFactory(new PropertyValueFactory<Daten, String>("login"));

			TableColumn<Daten, String> passwordCol = new TableColumn<Daten, String>("Spalte3");
			passwordCol.setCellValueFactory(new PropertyValueFactory<Daten, String>("passwort"));

			TableColumn<Daten, String> beschreibungCol = new TableColumn<Daten, String>("Spalte4");
			beschreibungCol.setCellValueFactory(new PropertyValueFactory<Daten, String>("beschreibung"));

			table.getColumns().addAll(accountCol, loginCol, passwordCol, beschreibungCol);

			table.setItems(olDaten);
			root.setCenter(table);

			olDaten.add(new Daten(new String[] { "0:0", "0:1", "0:2", "0:3" }));
			olDaten.add(new Daten(new String[] { "1:0", "1:1", "1:2", "1:3" }));

			table.setOnMouseClicked(new EventHandler<MouseEvent>() {
				@Override
				public void handle(MouseEvent event) {

					if (event.getButton().equals(MouseButton.SECONDARY)) {

						@SuppressWarnings("rawtypes")
						ObservableList<TablePosition> cells = table.getSelectionModel().getSelectedCells();

						for (@SuppressWarnings("rawtypes")
						TablePosition p : cells) {

							int r = p.getRow();
							int c = p.getColumn();

							System.err.println(r + " " + c);
						}
					}
				}
			});

			// end TABLE

			primaryStage.show();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		launch(args);
	}
}
 
Aha, dann brauchst du einen anderen Selection-Mode:
Java:
tableView.getSelectionModel().setCellSelectionEnabled(true);
Dann ist die ganze Zeile nicht mehr selektiert, aber der Click funktioniert dann richtig (könnte man eventuell dann per Hand alles selektieren lassen).
 
Aha, dann brauchst du einen anderen Selection-Mode:
Java:
tableView.getSelectionModel().setCellSelectionEnabled(true);
Dann ist die ganze Zeile nicht mehr selektiert, aber der Click funktioniert dann richtig (könnte man eventuell dann per Hand alles selektieren lassen).

Wunderbar, danke! Hab ich leider nicht gesehen.
Erstmal nicht schlimm das die ganze Zeile nicht selektiert wird, werd ich schon hin bekommen. 🙂
 
Vielleicht solltest du überlegen, ob du mit CSS styling die Cell-Selection für Tabellen noch etwas deutlicher machen kannst. Was mich an deiner Lösung (rein aus Sicht eines Nutzers) stören würde ist, dass mir nicht deutlich wird, dass man einzelne Zellen überhaupt auswählen kann... Vielleicht mal ein wenig in der modena.css dfes JDK stöbern und schauen, was du da für dich anpassen könntest... Ist komplex, aber ich denke, es würde sich lohnen.
 
Vielleicht solltest du überlegen, ob du mit CSS styling die Cell-Selection für Tabellen noch etwas deutlicher machen kannst. Was mich an deiner Lösung (rein aus Sicht eines Nutzers) stören würde ist, dass mir nicht deutlich wird, dass man einzelne Zellen überhaupt auswählen kann... Vielleicht mal ein wenig in der modena.css dfes JDK stöbern und schauen, was du da für dich anpassen könntest... Ist komplex, aber ich denke, es würde sich lohnen.

Du meinst wenn ich es wieder so mache, das die komplette Zeile markiert wird anstatt nur eine Zelle? Dann wäre das echt eine Überlegung wert.
Bin aber auch am überlgen ob ich es nicht einfach so lasse, das man nur Zellen markieren kann, weil es für die Nutzung garnicht anders benötigt wird, momentan zumindest.

Aber was allgemein CSS angeht wollte ich sowieso mal ein wenig rumm basten, hab nicht soo viel Erfahrung damit.
 

Zurück
Oben