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)で部分的に修正されているように見えます。JavaFX3.0で予定されているこれに関連する未解決の問題があります。誰でもアクセスにサインアップして、この回答にリンクされているjiraの問題を表示できます。

JavaFX2.2開発者プレビューはこちらから入手できます。


Javaのツールチップページコーナーをどのように変更しますか?

JavaFX cssリファレンスガイドは、ツールチップのcss構造に関する情報を提供します。これは、下部構造のクラスが.page-cornerであることを示しています。JavaFXのデフォルトのカスピアンスキンがページコーナーをどのようにスタイリングするかを確認するには、 caspian.cssを確認してください。この回答のリンクは2.2バージョンへのリンクです。必要に応じて、jfxrt.jarからJavaFXインストール用のcaspian.cssを抽出することもできます。

caspian.cssを取得したら、Tooltipを検索して、.page-cornercssクラスに適用されている特定のスタイルを確認できます。これがデフォルトの.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スタイルシートをロードします。たとえば、次のスタイルクラス定義は、ページの隅を輝く緑色のパックマンに変えます。

.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メソッドをオーバーライドすることもできます。このバージョンの円グラフソースの行670〜6は、ラベル行を生成する行です。


ストローク効果(ここでは白いダッシュ)は、セグメントで一貫していません。左端がクリップされているように見えることがよくあります

クリッピングは、円グラフのスライスノードに境界線を適用していて、円グラフに追加された後の項目が前の項目に重なるように円グラフが内部的に配置されているためです。太い境界線を追加すると、(最後に描画されたスライスを除いて)境界線は次に描画された円のスライスと重なります。これを回避するには、マウスで入力したメソッドでnode.toFront()を呼び出します。

ただし、ストロークには他にもオフセットの問題があり、パイスライス上でより適切に位置合わせする必要があります。ストローク幅を1に設定すると、うまく整列します。10などの大きな数値に設定すると、整列しなくなります。私の推測では、これはボーダースタイルのcss処理のバグであり、アカウントにサインアップして、JavaFX課題トラッカーにこれに関するjira課題を記録することをお勧めします。


おそらく、質問のタイトルに関係のない他の質問のいくつかを、個別のスタックオーバーフローの質問として投稿したほうがよいでしょう。

于 2012-08-08T22:10:56.150 に答える