Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
kennt jemand eine Möglichkeit wie ich die Selektierung der TableView mit dem Chart verbinden kann. Ich kann bei dem Chart den SelectionChangeListener benutzen, mir fehlt bloß der Weg zu dem Chart. Es handelt es sich um die gleichen Daten. Über Chart#getData() bekomme ich leider die Infos nicht heraus.
Kurz gesagt ich will sobald ich eine Selektierung auf die TableView den Node auf dem Chart Hervorheben oder anzeigen lassen und umgekehrt.
Hm. Klingt trivial, ist es aber, glaube ich zumindest, nicht. Ideen hätte ich schon, aber ich denke, das wird nicht ganz ohne werden. Und aus Mangel an eigenem Code, der deinem Problem nahe kommen würde, kann ich dir wirklich nur ein paar Code-Schnipsel geben, mit den Ideen, die ich dazu hätte.
Ich suche mal etwas Code zusammen und poste ihn dann...
Der Kontroller bietet eine Methode an, mit der man Datenpunkte hinzufügen kann:
Java:
protected void add(final int index, final XYChart.Data<Number, Number> data) {
add(index, lineChart.getData().get(index), data);
}
private void add(final int index, final LineChart.Series<Number, Number> series, final XYChart.Data<Number, Number> data) {
data.setNode(new HoveredThresholdNode(index, data.getYValue().longValue()));
PlatformHelper.run(() -> series.getData().add(data));
}
Wie du siehst, wird dort ein HoveredThresholdNode erstellt. Den habe ich mal irgendwann im Netz gefunden und sieht nach meinen Modifikationen so aus:
Java:
private class HoveredThresholdNode extends StackPane {
protected HoveredThresholdNode(final long index, final long value) {
setPrefSize(2, 2);
final Label label = createDataThresholdLabel(index, value);
final Circle circle = new Circle(2);
circle.setFill(Paint.valueOf("white"));
circle.getStyleClass().addAll(String.format("default-color%d", index), "chart-line-symbol", "chart-series-line");
circle.setId("label-chart-line-desc");
circle.setVisible(true);
setOnMouseEntered(mouseEvent -> {
getChildren().setAll(label);
setCursor(Cursor.NONE);
toFront();
});
setOnMouseExited(mouseEvent -> {
getChildren().setAll(circle);
setCursor(Cursor.DEFAULT);
});
getChildren().setAll(circle);
}
private Label createDataThresholdLabel(long index, long value) {
final Label label = new Label(SpeedFormatter.formatSpeed(value, SpeedFormatter.LIMIT_GBIT));
label.getStyleClass().addAll(String.format("default-color%d", index), "chart-line-symbol", "chart-series-line");
label.setId("label-chart-line-desc");
label.setMinSize(Label.USE_PREF_SIZE, Label.USE_PREF_SIZE);
return label;
}
}
Was macht das Ding? Wenn du mit der Maus darüber gehst, wird der Mauszeiger ausgeblendet und statt des Kreises, der den Datenpunkt darstellt, wird ein Label angezeigt.
Was bringt dir das? Nun, erst mal nichts. Aber du könntest das dahingehend modifizieren, dass du statt der Kombination Label+Kreis nur Kreis+Kreis (z.B. mit dem Radii 2 und 3) anlegst und normalerweise nur den kleinen anzeigst.
Du könntest jetzt irgendwo dein selektiertes Objekt der Tabelle speichern (als Klassen-Variable):
Java:
ObjectProperty<Object> objectProperty = new SimpleObjectProperty<>(null);
Dann müsstest du dein in der Tabelle gewähltes Objekt etwa so zwischenspeichern:
Der HoveredThresholdNode müsste umgeschrieben werden und sollte vielleicht auch noch eine Referenz auf das dahinterliegende Modell-Objekt enthalten (wieder als finale Klassenvariable):
Java:
// [...]
private final Object localObject;
private final ObjectProperty<Object> objectProperty; // Referenz auf das von oben
protected HoveredThresholdNode(final Object localObject, final ObjectProperty<Object> objectProperty, [... und weitere, wenn nötig ...]) {
this.localObject = localObject;
this.objectProperty = objectProperty;
final Circle circle1 = new Circle(2);
final Circle circle2 = new Circle(3);
circle1.managedProperty().bind(circle1.visibleProperty());
circle1.visibleProperty().bind(objectProperty.isNotEqualTo(localObject));
circle2.managedProperty().bind(circle2.visibleProperty());
circle2.visibleProperty().bind(objectProperty.isEqualTo(localObject));
// [...]
}
// [...]
Die Visible-Bindings sollten die Magie machen.
So. Das wäre meine Idee. Kannst ja mal berichten, ob es klappt oder nicht.
Grüsse
#edit: Das ich Object verwende, liegt nur daran, dass ich deine Modellklasse ja nicht kenne.
Vielen Dank dzim, das Beispiel mit dem Threshold habe ich auch schon gefunden, fand das leider etwas gefrimmel für das was ich wollte. Aber ich denke ich komme da nicht drum rum.