JavaFX TableView - nicht ausgewählte Reihe ansprechen

Raikbit

Mitglied
Hi, ich habe wie im Titel beschrieben das Problem, dass ich nicht weiß wie ich in einem TableView ein nicht selektiertes Element anspreche.

Also was ich machen möchte:

ich habe eine Tabelle mit Einträgen in 3 Spalten und n-Zeilen. Nun möchte ich Zeile n auslesen ohne sie auswählen zu müssen und wenn meine Bedingung erfüllt ist Zeile n grün einfärben (Hintergrundfarbe).

________________________________________________________________________________

finde leide überall nur die Fälle ändern wenn ausgewählt ...

:rtfm:
 

dzim

Top Contributor
Nun ja, deine Daten sind ja alle in der Items-Liste deiner TableView, daher musst du also einen deiner TableCell-Implementierungen heranziehen, um hier die Änderung zu machen.
Z.B. scheint hier jemand etwas zu machen, das dir helfen könnte:
java - JavaFX tableview colors - Stack Overflow

Du musst also irgend etwas á la dem folgendem machen:

(z.B. im initialize deines Controllers:
Java:
	@Override
	public void initialize(URL location, ResourceBundle resources) {

		// [...]

Callback<TableColumn.CellDataFeatures<Device, Device>, ObservableValue<Device>> contentCallback = new Callback<TableColumn.CellDataFeatures<Device, Device>, ObservableValue<Device>>() {
			@Override
			public ObservableValue<Device> call(CellDataFeatures<Device, Device> param) {
				return new SimpleObjectProperty<Device>(param.getValue()); // dein Objekt per Zeile
			}
		};
		
		tableColumnDetected.setCellValueFactory(contentCallback);
		tableColumnDetected.setCellFactory(new Callback<TableColumn<Device, Device>, TableCell<Device, Device>>() {
			@Override
			public TableCell<Device, Device> call(TableColumn<Device, Device> param) {
				return new DeviceDetectedTableCell(); // dein Tabellen-Zelle
			}
		});

		// [...]

	}

	/*
	 * [...] weitere Klassen/Methoden/Whatever
	 */

	public class DeviceDetectedTableCell extends TableCell<Device, Device> {
		
		public DeviceDetectedTableCell() {}
		
		@Override
		protected void updateItem(Device item, boolean empty) {
			
			super.updateItem(item, empty);
			
			if (empty) {
				textProperty().unbind();
				setText(null);
				graphicProperty().unbind();
				setGraphic(null);
			} else {
				setTextOverrun(OverrunStyle.ELLIPSIS);
				// an bestimmten Zustand deiner Datenzeile oder irgend einen anderen Trigger binden
				textProperty().bind(new DeviceDetectedStringBinding(item));
				graphicProperty().bind(new DeviceDetectedBinding(item));
				setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
			}
			// oder wie im StackOverflow-Post beschrieben hier direkt die Farben setzen
			// mit einem Binding aber bist du flexibler - du musst da ja nix besonderes machen, sondern kannst da ja 
			// statt wie ich das item, die TableRow übergeben und dann die "priority" setzen
		}
	}

Ist die Kombination aus StackOverflow und meinem geistigen Erguss halbwegs klar? Ich verstehe mich ja total ;-)
 

Raikbit

Mitglied
hmm nich so richtig ... hatte die Seite von Stack auch schon offen...

also ich mach mal nen Beispielpseudocode rein:

Code:
protected void markRow() {
		for (int i = 0; i < Eintraege.size(); i++) {
			if (Eintag n erfüllt Bedingung) {
				if (Table.getItems().get(i).getSpalte1().equals(Bedingung1())
						&& Table.getItems().get(i).getSpalte2().equals(Bedingung2())) {

					System.out.println("jetzt einfärben");
					ownTaskCardTable.getRow(i).set(BackgroundcolorGreen);

				}
			}
		}
	}

also ich weiß halt nicht wie ich an die Row komme und diese dann einfärbe. Die for und if funkionieren.
 

dzim

Top Contributor
Das geht nicht ganz so einfach, glaube ich. Du hast aber von innerhalb der TableCell Zugriff darauf, daher meine ich, dass es dort die richtige Stelle ist und das zeigte die StackOverflow-Frage.

Dein Model sollte vielleicht ein weiteres Feld - einen Indikator irgendeiner Art - enthalten (den musste ja nicht abspeichern, der muss nur zur Laufzeit da sein), dann könnte deine Pseudo-Code-Methode eben diesen Indicator manipulieren.

Ich habe es jetzt eine Weile probiert, weil ich schon ein paar mehr Hinweise liefern wollte, muss aber zugeben, dass das wirklich nicht so recht klappt. Jedenfalls bei mir unter Java7u45... Vielleicht solltest du die Frage noch mal auf StackOverflow und/oder einem JavaFX-orientierten Forum von Oracle stellen.
Ich komme damit leider auch nicht weiter und hab dann doch noch ein paar andere Dinge zu tun.

Sorry!
 

dzim

Top Contributor
Heureka!

Eine Kombination aus meinem bisherigen Ansatz, dem von StackOverflow und dem hier
https://gist.github.com/jewelsea/5470095
hat mir weitergeholfen.

Ich hab bei mir bereits ein Binding in meiner TableCell für den Graphics-Node auf eine BooleanProperty meines Models:

Java:
	public class DeviceDetectedTableCell extends TableCell<Device, Device> {
		
		public DeviceDetectedTableCell() {}
		
		@Override
		protected void updateItem(Device item, boolean empty) {
			
			super.updateItem(item, empty);

			if (empty) {
				textProperty().unbind();
				setText(null);
				graphicProperty().unbind();
				setGraphic(null);
			} else {
				setTextOverrun(OverrunStyle.ELLIPSIS);
				textProperty().bind(new DeviceDetectedStringBinding(item));
				graphicProperty().bind(new DeviceDetectedBinding(item));
				setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
			}
		}
	}

Erster Schritt: CSS anpassen
HTML:
.highlight {
  -fx-control-inner-background: skyblue;
  -fx-accent: derive(-fx-control-inner-background, -40%);
  -fx-cell-hover-color: derive(-fx-control-inner-background, -20%);
}

Zweiter Schritt: Styleclass in der Zelle
Java:
	public class DeviceDetectedTableCell extends TableCell<Device, Device> {
		
		public DeviceDetectedTableCell() {}
		
		@Override
		protected void updateItem(Device item, boolean empty) {
			
			super.updateItem(item, empty);
			getTableRow().getStyleClass().remove("highlight");
			if (empty) {
				textProperty().unbind();
				setText(null);
				graphicProperty().unbind();
				setGraphic(null);
			} else {
				setTextOverrun(OverrunStyle.ELLIPSIS);
				textProperty().bind(new DeviceDetectedStringBinding(item));
				graphicProperty().bind(new DeviceDetectedBinding(item, this));
				setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
			}
		}
	}

Dritter Schritt: Anpassen des DeviceDetectedBindings
Java:
	private final class DeviceDetectedBinding extends ObjectBinding<Node> {
		
		private final Device device;
		private final TableCell<Device, Device> cell;
		
		public DeviceDetectedBinding(final Device device, final TableCell<Device, Device> cell) {
			this.device = device;
			this.cell = cell;
			super.bind(device.detected());
			super.bind(device.licensed());
		}
		
		@Override
		protected Node computeValue() {
			ImageView iv = null;
			if (device.isDetected()) {
				if (device.isLicensed()) {
					iv = ImageResource.getImageView("fugue/tick-circle.png");
				} else {
					iv = ImageResource.getImageView("fugue/skull.png");
				}
				cell.getTableRow().getStyleClass().add("highlight");
			} else {
				iv = ImageResource.getImageView("fugue/cross-circle.png");
				cell.getTableRow().getStyleClass().remove("highlight");
			}
			return iv;
		}
	}
Hier kam jetzt die TableCell in den Konstruktor und die beiden Styleclass-Sachen hinzu.

Du kannst hier einfach faken, indem du entweder in der Zelle einfach nur
Code:
setContentDisplay(ContentDisplay.TEXT_ONLY);
machst, oder als Node einfach null zurück gibst.

Wenn mich nicht alles täuscht, kann man dann nur noch sagen: Simsalabim! Und fertig ist der Lack!

Viel Erfolg!

PS: Wie gesagt, der obere Teil meiner Aussage aus dem letzten Post bleibt bestehen. Du musst schon einen Indicator (eine Property!) haben und deine markRow-Methode muss hier nur den Indicator anpassen, der Rest geschiet über das Binding!
 

dzim

Top Contributor
Das Thema wurde beendet... Ich gehe davon aus, dass es geklappt hat? Etwas Feedback wäre im Forum durchaus willkommen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A TableView updatet sich nicht AWT, Swing, JavaFX & SWT 3
G Bekomme ResultSet mittels ObservableList nicht ins TableView AWT, Swing, JavaFX & SWT 25
Bluedaishi TableView mit Combox wert wird nicht in die TableView gesetzt AWT, Swing, JavaFX & SWT 38
J JavaFX Elemente werden nicht zu TableView hinzugefügt AWT, Swing, JavaFX & SWT 3
J TableView Daten werden nicht ausgegeben AWT, Swing, JavaFX & SWT 9
zhermann TableView wird nicht gefüllt AWT, Swing, JavaFX & SWT 14
MaxG. JavaFX Inhalt in Tableview wird nicht angezeigt AWT, Swing, JavaFX & SWT 11
N JavaFX TableView füllt nicht das gesamte ScrollPanle aus AWT, Swing, JavaFX & SWT 2
B SimpleLongProperty in TableView wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
G JavaFX TableView - Änderungen werden nicht übernommen. AWT, Swing, JavaFX & SWT 3
Rudolf Nicht funktionierendes Databinding an POJOs für TableView AWT, Swing, JavaFX & SWT 2
Juelin setzen background color für selected Row im Tableview AWT, Swing, JavaFX & SWT 21
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
missy72 JavaFX TableView Spalte zwischen den Zeilen AWT, Swing, JavaFX & SWT 5
W TableView füllen AWT, Swing, JavaFX & SWT 18
missy72 JavaFX TableView / IconView mit MousEvent AWT, Swing, JavaFX & SWT 7
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
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
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
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
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
M JavaFX JavaFX ResultSet in TableView ausgeben AWT, Swing, JavaFX & SWT 2
W JavaFX Mehrere Klassen in ein TableView AWT, Swing, JavaFX & SWT 6
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
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

Ähnliche Java Themen

Neue Themen


Oben