2016-02-02 35 views
1

基本上,當我將鼠標懸停在其中一個峯上時,我想顯示一些額外信息的工具提示。如何在顯示器上確定javafx的折線圖峯值位置

但是,我無法猜測如何獲取峯值的位置監視器上(因爲提示詢問你的顯示器的絕對座標)

這是我當前的代碼

//dateNumberData is the peak 

Tooltip tooltip = new Tooltip(); 
//Here i just edit tooltip info 
dateNumberData.getNode().setOnMouseEntered(event -> { 
    tooltip.show(dateNumberData.getNode(), 
     dateNumberData.getNode().localToScreen(dateNumberData.getNode().getLayoutX(), 0).getX(), 
     dateNumberData.getNode().localToScreen(0, dateNumberData.getNode().getLayoutY()).getY()); 
    }); 
dateNumberData.getNode().setOnMouseExited(event -> tooltip.hide()); 

但提示出現在所有在那個地方。如果我使用dateNumberData.getNode().getParent().localToScreen()提示只是不會出現在所有(但tooltip.getX()返回還挺正確的座標。至少它shoudld與座標顯示)

回答

0

layoutX()layoutY()屬性不正確的人在這裏使用。那些可能是是父節點中的節點的座標,儘管您不知道該節點是通過設置節點來定位的。它可能會使用翻譯或其他佈局機制。而是使用getBoundsInLocal()然後轉換邊界。

向工具提示添加一個小偏移量也是一個好主意:這不僅看起來更好,而且可以防止工具提示模糊節點,這意味着您觸發鼠標退出並最終重複循環。

dateNumberData.getNode().setOnMouseEntered(event -> { 

    Bounds bounds = dateNumberData.getNode().localToScreen(dateNumberData.getNode().getBoundsInLocal()); 
    tooltip.show(dateNumberData.getNode(), 
     bounds.getMaxX()+15, 
     bounds.getMaxY()+5); 
    }); 

這裏是一個SSCCE:

import java.util.Random; 

import javafx.application.Application; 
import javafx.geometry.Bounds; 
import javafx.scene.Scene; 
import javafx.scene.chart.LineChart; 
import javafx.scene.chart.NumberAxis; 
import javafx.scene.chart.XYChart.Data; 
import javafx.scene.chart.XYChart.Series; 
import javafx.scene.control.Tooltip; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 

public class LineChartWithTooltip extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     LineChart<Number, Number> chart = new LineChart<>(new NumberAxis(), new NumberAxis()); 
     Series<Number, Number> series = new Series<>(); 
     series.setName("Data"); 
     Random rng = new Random(); 
     for (int i = 0 ; i <= 10; i++) { 
      series.getData().add(new Data<>(i, rng.nextDouble())); 
     } 
     chart.getData().add(series); 

     Tooltip tooltip = new Tooltip(); 
     for (Data<Number, Number> d : series.getData()) { 
      d.getNode().setOnMouseEntered(event -> { 
       tooltip.setText(String.format("[%d, %.3f]", d.getXValue().intValue(), d.getYValue().doubleValue())); 
       Bounds nodeBounds = d.getNode().getBoundsInLocal(); 
       Bounds nodeBoundsInScreen = d.getNode().localToScreen(nodeBounds); 
       tooltip.show(d.getNode(), 
         nodeBoundsInScreen.getMaxX()+15, 
         nodeBoundsInScreen.getMaxY()+5); 
        }); 
      d.getNode().setOnMouseExited(event -> tooltip.hide()); 
     } 

     primaryStage.setScene(new Scene(new BorderPane(chart), 600, 600)); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

我知道我需要添加一些彌補,我要的是後來添加的,但我實際上並沒有想到它會重疊節點和觸發'onMouseExited()'這可能就是爲什麼帶有'.getParent()'的代碼沒有顯示任何工具提示,並且我得到的垃圾郵件與調試輸出我加在這裏... – Meegoo

+0

所以這解決了它?或不?我無法從您的評論中得知。我更新了一個完整的例子。 –

+0

終於有時間檢查。是的,它解決了。 '.getParent()'+添加一些偏移量就可以了 – Meegoo

相關問題