W JavaFX 2.x używam XYChart i chcę wyświetlić wartości współrzędnych osi (X, Y) wykresu podczas przesuwania myszy w poprzek wykres. Konfiguruję program obsługi zdarzeń na wykresie, aby obsłużyć zdarzenia setOnMouseMoved. Jednak nie jestem pewien, jak przekonwertować wartość getX() MouseEvent na wartość współrzędnych wykresu?JavaFX 2.x: Przetłumacz współrzędną kliknięcia myszy na wartość osi XYChart
Odpowiedz
Zastosowanie axis.getValueForDisplay(displayPosition) do określenia położenia myszki w wartości osi współrzędnych:
xAxis.getValueForDisplay(mouseEvent.getX()),
yAxis.getValueForDisplay(mouseEvent.getY())
Oto przykład, który raportuje współrzędne myszy nad którym unosi się na wykresie liniowym. Przechwytywanie ekranu nie uchwycić kursorem myszy - musisz po prostu wyobrazić go tam ;-)
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.*;
import javafx.scene.chart.*;
import javafx.scene.control.Label;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class LineChartWithHoverCoords extends Application {
@Override public void start(Stage stage) {
stage.setTitle("Line Chart Sample");
final LineChart<Number, Number> lineChart = createChart();
Label cursorCoords = createCursorGraphCoordsMonitorLabel(lineChart);
stage.setScene(
new Scene(
layoutScene(
lineChart,
cursorCoords
)
)
);
stage.show();
}
private VBox layoutScene(LineChart<Number, Number> lineChart, Label cursorCoords) {
VBox layout = new VBox(10);
layout.setPadding(new Insets(10));
layout.setAlignment(Pos.CENTER);
layout.getChildren().setAll(
cursorCoords,
lineChart
);
return layout;
}
private LineChart<Number, Number> createChart() {
final NumberAxis xAxis = new NumberAxis();
final NumberAxis yAxis = new NumberAxis();
xAxis.setLabel("Number of Month");
final LineChart<Number,Number> lineChart =
new LineChart<>(xAxis,yAxis);
lineChart.setTitle("Stock Monitoring, 2010");
XYChart.Series<Number, Number> series = new XYChart.Series<>(
"My portfolio", FXCollections.<XYChart.Data<Number, Number>>observableArrayList(
new XYChart.Data<Number, Number>(1, 23),
new XYChart.Data<Number, Number>(2, 14),
new XYChart.Data<Number, Number>(3, 15),
new XYChart.Data<Number, Number>(4, 24),
new XYChart.Data<Number, Number>(5, 34),
new XYChart.Data<Number, Number>(6, 36),
new XYChart.Data<Number, Number>(7, 22),
new XYChart.Data<Number, Number>(8, 45),
new XYChart.Data<Number, Number>(9, 43),
new XYChart.Data<Number, Number>(10, 17),
new XYChart.Data<Number, Number>(11, 29),
new XYChart.Data<Number, Number>(12, 25)
)
);
lineChart.getData().add(series);
return lineChart;
}
private Label createCursorGraphCoordsMonitorLabel(LineChart<Number, Number> lineChart) {
final Axis<Number> xAxis = lineChart.getXAxis();
final Axis<Number> yAxis = lineChart.getYAxis();
final Label cursorCoords = new Label();
final Node chartBackground = lineChart.lookup(".chart-plot-background");
for (Node n: chartBackground.getParent().getChildrenUnmodifiable()) {
if (n != chartBackground && n != xAxis && n != yAxis) {
n.setMouseTransparent(true);
}
}
chartBackground.setOnMouseEntered(new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent mouseEvent) {
cursorCoords.setVisible(true);
}
});
chartBackground.setOnMouseMoved(new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent mouseEvent) {
cursorCoords.setText(
String.format(
"(%.2f, %.2f)",
xAxis.getValueForDisplay(mouseEvent.getX()),
yAxis.getValueForDisplay(mouseEvent.getY())
)
);
}
});
chartBackground.setOnMouseExited(new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent mouseEvent) {
cursorCoords.setVisible(false);
}
});
xAxis.setOnMouseEntered(new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent mouseEvent) {
cursorCoords.setVisible(true);
}
});
xAxis.setOnMouseMoved(new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent mouseEvent) {
cursorCoords.setText(
String.format(
"x = %.2f",
xAxis.getValueForDisplay(mouseEvent.getX())
)
);
}
});
xAxis.setOnMouseExited(new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent mouseEvent) {
cursorCoords.setVisible(false);
}
});
yAxis.setOnMouseEntered(new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent mouseEvent) {
cursorCoords.setVisible(true);
}
});
yAxis.setOnMouseMoved(new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent mouseEvent) {
cursorCoords.setText(
String.format(
"y = %.2f",
yAxis.getValueForDisplay(mouseEvent.getY())
)
);
}
});
yAxis.setOnMouseExited(new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent mouseEvent) {
cursorCoords.setVisible(false);
}
});
return cursorCoords;
}
public static void main(String[] args) {
launch(args);
}
}
Chciałem napisać komentarz, ale nie wiem jak . To jest dodatkowy komentarz, więc następny facet, który natknie się na problem, nie spędza wielu godzin zastanawiając się, dlaczego. Odpowiedź jest prawidłowa, ale należy zachować ostrożność podczas korzystania z ImageCursor, podaje złe współrzędne. Po wyłączeniu powiększania, przewijania i dat oraz wszystkich moich dostosowań znalazłem, że użycie niestandardowego kursora zrujnuje współrzędne "getValueForDisplay".
- 1. Przetłumacz współrzędne myszy na plan 3D
- 2. JavaFX 2.x TableView lokalizacja
- 3. Jak uzyskać współrzędną (X, Y) kursora na arkuszu?
- 4. Uzyskaj współrzędną 3D klikniętego punktu myszy trzema .js
- 5. JavaFX 2.x: Jak edytować linie rysowane na XY LineChart?
- 6. Jak sformatować etykietę zaznaczenia osi X w formacie 2^x?
- 7. emacs 23,4 zachowanie myszy 2 na OS-X 10.7
- 8. Angular 2 zdarzenia z kliknięcia prawym przyciskiem myszy?
- 9. Jak ustawić wartość na etykiecie osi x w achartengine
- 10. Jak zmienić wartość logiczną na kliknięcia w kątowym 2 komponentu
- 11. Wiele myszy na OS X
- 12. Wyłącz kliknięcia myszy w Emacs
- 13. Jak wyłączyć przycisk kliknięcia myszy?
- 14. Kliknij prawym przyciskiem myszy JavaFX?
- 15. Przechwytywanie każdego kliknięcia myszy do aplikacji WPF
- 16. Przetłumacz prośbę cURL na Guzzle
- 17. Wykrywanie zdarzenia kliknięcia środkowym przyciskiem myszy jQuery
- 18. JFreeChart skala osi x
- 19. Dostosowywanie tyknięć osi X
- 20. Subplots z datami na osi X
- 21. Data/godzina Gnuplot na osi X
- 22. Matplotlib - ukrywanie konkretnych znaczników na osi X
- 23. Struny matplotlib jako etykiety na osi X
- 24. Podaj odcienie między datami na osi X
- 25. Pyplot: użycie procentu na osi X
- 26. Umieszczanie osi X na górze wykresu ggplot2
- 27. JavaFX 2 debug css
- 28. Wykrywanie koła myszy na osi X (w lewo i w prawo) za pomocą Javascriptu
- 29. Przetłumacz matlab na python/numpy
- 30. Przetłumacz tabelę na słownik hierarchiczny?
Jedno słowo ostrożności dotyczące ustawiania programów obsługi zdarzeń w regionie tła wykresu - ten element regionu NIE jest elementem nadrzędnym danych wykresu, ale jest rodzeństwem. Zdarzenia myszy, które występują w elementach danych wykresu (lub etykietach lub ścieżkach), nie zostaną dostarczone (ani w etapach filtrowania ani propagacji) do tego programu obsługi. – Mikeb