4

我在 JavaFx 中画线时遇到问题。我们正在制作一个模拟交通的应用程序 - 有 16 条街道,每条街道都有不同的颜色,具体取决于交通情况。有一张很简单的图:http: //img546.imageshack.us/img546/9949/uliceu.jpg

我关于如何做到这一点的第一个想法是将街道画成线条并简单地改变它的颜色。但我不能把文字放在线上(我想要一个带有街道名称的文字)。所以我试图在 StackPane 上放一行和一个文本。然后我在 BorderPane 中心添加了 StackPanes ......但它没有用。似乎 StackPane 不尊重行的开始 x,开始 y ......这些行相互重叠。

该应用程序的主窗格是 BorderPane,我想将地图放在中心。它不需要动态调整大小,我们只有一张地图,因此可以静态定位。

我需要这样的东西: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,而是使用普通的Pane(如果您需要对窗格进行 CSS 样式设置或在调整窗格大小时调整窗格中的控件),否则,请使用Group。正如您所说,您正在绘制的地图不需要动态调整大小,那么也许只是一个 Group 就可以了。

项目在组或窗格的子列表中的放置顺序将决定项目的呈现顺序。首先添加到列表的项目将首先呈现,最后添加到列表的项目将呈现在最先添加的项目之上。因此,您首先将街道线添加到窗格或组中,然后在街道顶部添加文本(或标签)。

另一种选择是使用直接绘制Canvas,但对于您的应用程序,在窗格或组中使用场景图对象可能是更好的方法。

使用一个窗格/组,首先添加所有街道,然后是所有名称,或者一个窗格/组用于所有街道,另一个用于所有街道名称。单独的窗格可能会很好,因为您可以根据需要通过在街道名称组上设置可见标志来切换街道名称的可见性。不要将一个组用于一条街道及其名称,然后尝试将多个街道+街道名称组叠加在一起,否则在交叉路口,一些街道名称将被它们顶部的街道遮挡。

当我画一条线时,我可以指定位置 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 回答