2

我昨天刚刚了解了 JavaFX,现在正在测试图形选项。我在 Oracle 网站 ( http://docs.oracle.com/javafx/2/charts/pie-chart.htm )的饼图示例中注意到了这种行为,但我添加了更多数据点和一些悬停效果来实现它更明显。

当您将鼠标悬停在图表上时,MouseEvent 并不总是由正确的数据段处理。鼠标光标越靠近饼图的中心,这种效果就越明显。据我所知,当靠近边缘时,行为是准确的。

谁能证实这一点?这是一个错误,还是我做错了什么?

尝试移动鼠标,从线段的标记边缘开始,向内移动到中心,查看光标下的线段是否正确指示。

图表的屏幕截图 - 鼠标是工具提示显示的地方

我在玩这张图表时注意到的其他几件事 –</p>

  1. 笔划效果(此处为白色破折号)在段上不一致。左边缘通常看起来被剪裁了
  2. 你如何在java中更改工具提示页面角?在 CSS 中是“.page-corner”
  3. 有没有办法改变饼标签线的形状,或者把圆形端点一起去掉?

编辑:忘记添加代码!

package piechartsample;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.geometry.Side;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.scene.chart.*;
import javafx.scene.control.Label;
import javafx.scene.control.Tooltip;
import javafx.scene.effect.Glow;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.shape.StrokeType;
import javafx.scene.Node;

public class PieChartSample extends Application {

    private PieChart.Data selectedData;
    private Tooltip tooltip;

    @Override
    public void start(Stage stage) {

        ObservableList<PieChart.Data> pieChartData =
                FXCollections.observableArrayList(
                new PieChart.Data("Grapefruit", 13),
                new PieChart.Data("Orange", 25),
                new PieChart.Data("Plum", 10),
                new PieChart.Data("Pear", 22),
                new PieChart.Data("Banana", 10),
                new PieChart.Data("Peach", 5),
                new PieChart.Data("Apricot", 1),
                new PieChart.Data("Pineapple", 20),
                new PieChart.Data("Passion Fruit", 100),
                new PieChart.Data("Lychee", 5));

        final PieChart chart = new PieChart(pieChartData);
        chart.setTitle("Fruits Graph");
        chart.setLabelLineLength(10);
        chart.setLegendSide(Side.LEFT);

        final Label caption = new Label("");
        caption.setTextFill(Color.DARKORANGE);
        caption.setStyle("-fx-font: 24 arial;");

        tooltip = new Tooltip("");

        tooltip.setStyle("-fx-font: 14 arial;  -fx-font-smoothing-type: lcd;");// -fx-text-fill:black; -fx-background-color: linear-gradient(#e2ecfe, #99bcfd);");


        for (final PieChart.Data data : chart.getData()) {
            Tooltip.install(data.getNode(),tooltip);
            applyMouseEvents(data);
        }

        BorderPane pane = new BorderPane();
        pane.setCenter(chart);
        Scene scene = new Scene(pane);
        stage.setTitle("Fruits");
        stage.setScene(scene);
//        scene.getStylesheets().add("piechartsample/Chart.css");
        stage.show();
    }

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

    private void applyMouseEvents(final PieChart.Data data) {

        final Node node = data.getNode();

        node.setOnMouseEntered(new EventHandler<MouseEvent>() {

            @Override
            public void handle(MouseEvent arg0) {
                node.setEffect(new Glow());
                String styleString = "-fx-border-color: white; -fx-border-width: 3; -fx-border-style: dashed;";
                node.setStyle(styleString);
                tooltip.setText(String.valueOf(data.getName() + "\n" + (int)data.getPieValue()) ); 
            }
        });

        node.setOnMouseExited(new EventHandler<MouseEvent>() {

            @Override
            public void handle(MouseEvent arg0) {
                node.setEffect(null);
                node.setStyle("");
            }
        });

        node.setOnMouseReleased(new EventHandler<MouseEvent>() {

            @Override
            public void handle(MouseEvent mouseEvent) {
                    selectedData = data;
                    System.out.println("Selected data " + selectedData.toString());
            }
        });
    }

}
4

1 回答 1

1

MouseEvent 的饼图不正确的拾取行为

对于您的特定实现,我在使用 JavaFX 2.2 时没有遇到切片区域的挑选问题。

饼图切片区域的选择错误似乎是一个已知问题。对于 JavaFX 2.2 (jdk7u6),该问题似乎已部分修复。有一个与 JavaFX 3.0 计划相关的悬而未决的问题。任何人都可以注册访问以查看此答案中链接的 jira 问题。

JavaFX 2.2 开发人员预览版可在此处获得。


你如何在java中更改工具提示页面角?

JavaFX css 参考指南提供了有关工具提示的 css 结构的信息。这表明子结构具有 .page-corner 类。要查看 JavaFX 默认里海皮肤如何设置页面角的样式,您可以查看caspian.css。此答案中的链接指向 2.2 版本。如果需要,您还可以从 jfxrt.jar 为您的 JavaFX 安装提取 caspian.css。

拥有 caspian.css 后,您可以搜索 Tooltip 以查看应用于 .page-corner css 类的特定样式。这是默认的 .page-corner 样式 =>

.page-corner {
  -fx-padding: 4.5 4.5 4.5 4.5;
  -fx-background-color: linear-gradient( from 0% 0% to 50% 50%, #fcf7b6, #a59c31);
  -fx-shape: "M0,0H9L0,9Z";
  -fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 4 , 0.0 , 0 , 0 );
}

要更改默认样式,请使用您对页面角的特定定义加载您自己的用户 css 样式表。例如,下面的 styleclass 定义会将页面角落变成一个发光的绿色 pac-man。

.page-corner {
  -fx-padding: 10;
  -fx-background-color: green;
  -fx-shape: "M30,20 h-15 a15,15 0 1,0 15,-15 z";
  -fx-effect: dropshadow( three-pass-box , derive(green, 40%), 10, 0.0 , 0 , 0 );
}

有没有办法改变饼标签线的形状,或者把圆形端点一起去掉?

是的,但这并不完全简单。

pie-label-line 似乎是一个已实现的单个路径,其样式通过:

.chart-pie-label-line {
  -fx-stroke: #aaaaaa;
  -fx-fill: #aaaaaa;
}

要更改路径的形状,您可以在图表显示后在标签线上进行查找,并编写一些代码从中删除球元素;例如(Path) chart.lookup(".chart-pie-label-line"),或者您可以继承 PieChart 并覆盖该layoutChartChildren方法。此版本的PieChart 源中的第 670-6 行是生成标签线的行。


笔划效果(此处为白色破折号)在段上不一致。左边缘通常看起来被剪裁了

剪辑是因为您将边框应用于饼图切片节点,并且饼图在内部布局,以便添加到图表中的后面的项目覆盖前面的项目。当您添加粗边框时,(除了绘制的最后一个切片)边框将与绘制的下一个饼图重叠。您可以通过在鼠标输入方法中调用node.toFront()来解决此问题。

然而,笔画还有其他偏移问题,它应该更好地对齐饼图。如果笔画宽度设置为 1,它会很好地对齐,如果它设置为更大的数字,例如 10,它最终不会对齐。我的猜测是这是边框样式的 css 处理中的一些错误,并鼓励注册一个帐户并在 JavaFX 问题跟踪器中记录有关此问题的jira 问题。


将与问题标题无关的其他一些问题作为单独的 stackoverflow 问题发布可能会更好。

于 2012-08-08T22:10:56.150 回答