4

JavaFxでの線の描画に問題があります。交通をシミュレートするアプリケーションを作成しています。16の道路があり、すべての道路の色は交通に応じて異なります。非常に単純な画像があります:http: //img546.imageshack.us/img546/9949/uliceu.jpg

これを行う方法についての私の最初のアイデアは、通りを線として描画し、単にその色を変更することでした。しかし、行にテキストを入れることはできません(通りの名前のテキストが必要です)。そこで、StackPaneに行とテキストを配置しようとしました。次に、BorderPaneセンターにStackPanesを追加しました...しかし、機能しませんでした。StackPaneは行の開始x、開始yを尊重していないようです...行は互いに重なり合っています。

アプリのメインペインはBorderPaneで、地図を中央に配置したいと思います。動的にサイズを変更する必要はありません。マップは1つしかないため、静的に配置できます。

私はそのようなものが必要です:http: //img834.imageshack.us/img834/1157/ulicac.jpg しかし、通りは互いに接続する必要があります...最初の写真のように

それを行う方法について何か提案はありますか?ヒントをいただければ幸いです:)

そのように:

Group gr = new Group();    
Text text = new Text("1st Street");  
text.setFill(Color.web("fabbff"));
Line line = new Line(0, 150, 200,150);   
line.setStrokeWidth(20); 
line.setStroke(Color.web("000000")); 
gr.getChildren().addAll(line, text);
group.getChildren().addAll(gr, //and every other street);
4

2 に答える 2

3

使用していたStackPaneは、デフォルトですべてをStackPaneの中央に配置しますが、これは希望どおりではありません。

StackPaneの代わりに、プレーンペインを使用します(ペインのCSSスタイルを設定する必要がある場合、またはペインのサイズを変更するときにペインのコントロールのサイズを変更する必要がある場合)。それ以外の場合は、グループを使用します。描画しているマップのサイズを動的に変更する必要はないと述べているので、おそらくグループだけで十分です。

グループまたはペインの子リスト内にアイテムが配置される順序によって、アイテムがレンダリングされる順序が決まります。リストに最初に追加されたアイテムが最初にレンダリングされ、リストに最後に追加されたアイテムが最初に追加されたアイテムの上にレンダリングされます。したがって、最初にストリートラインをペインまたはグループに追加してから、ストリートの上にテキスト(またはラベル)を追加します。

もう1つのオプションは、直接描画キャンバスを使用することですが、アプリケーションでは、ペインまたはグループでシーングラフオブジェクトを使用する方がおそらくより良いアプローチです。

最初にすべての道路を追加した1つのペイン/グループを使用し、次にすべての名前を追加するか、すべての道路に1つのペイン/グループを使用し、すべての道路名に別のペイン/グループを使用します。通りの名前グループに表示フラグを設定することで、必要に応じて通りの名前の表示を切り替えることができるため、個別のペインが便利な場合があります。通りとその名前の両方に1つのグループを使用しないでください。次に、複数の通り+通りの名前のグループを重ねてみてください。そうしないと、交差点で通りの名前の一部が、その上を走る通りによって隠されてしまいます。

線を引くときに位置x、yを指定できますが、テキストまたはラベルの位置を設定できません...またはできますか?

線の作成時に座標を提供して線を配置するだけでなく、線の上に表示されるようにテキストを配置する必要もあります。text.relocate(x、y)メソッドを使用して、特定の場所にテキストを配置できます。

于 2013-02-08T20:12:49.767 に答える
2

私はこれが古いスレッドであることを知っています。しかし、私は同じ質問をしました:ラインを動かさないようにロバストなラベルをラインに追加する方法。このコードは私のために働きます:

line = new Line();
line.startXProperty().bind(source.layoutXProperty().add(source.getBoundsInParent().getWidth() / 2.0));
line.startYProperty().bind( source.layoutYProperty().add(source.getBoundsInParent().getHeight() / 2.0));

line.endXProperty().bind( target.layoutXProperty().add( target.getBoundsInParent().getWidth() / 2.0));
line.endYProperty().bind( target.layoutYProperty().add( target.getBoundsInParent().getHeight() / 2.0));


label.layoutXProperty().bind(line.endXProperty().subtract(line.endXProperty().subtract(line.startXProperty()).divide(2)));
label.layoutYProperty().bind(line.endYProperty().subtract(line.endYProperty().subtract(line.startYProperty()).divide(2)));

getChildren().addAll( line, label);
于 2018-01-11T21:35:01.280 に答える