2013-02-08 2 views
4

У меня проблема с рисованием линий в JavaFx. Мы делаем приложение, имитирующее трафик, - есть 16 улиц, и каждая улица имеет другой цвет, зависящий от трафика. Существует очень простая картина: http://img546.imageshack.us/img546/9949/uliceu.jpgСтроки рисования javafx и текст

Моя первая мысль о том, как это сделать, заключалась в том, чтобы нарисовать улицы как линии и просто изменить их цвета. Но я не могу наложить текст на строку (я хочу текст с названием улицы). Поэтому я попытался поместить строку и текст в StackPane. Затем я добавил, что StackPanes на BorderPane центре ... Но это не сработало. Кажется, что 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); 

ответ

3

StackPane вы использовали волю центра по умолчанию все в центре StackPane, который не будет то, что вы хотите.

Вместо StackPane используйте обычную Pane (если вам нужно стилизовать CSS-панель или иметь элементы управления в области изменения размера страницы при изменении размера панели), в противном случае используйте Group. Поскольку вы заявляете, что карта, которую вы рисуете, не нуждается в динамическом изменении, тогда, возможно, просто группа в порядке.

Порядок, в котором элементы размещаются внутри группы или списка дочерних элементов панели, будет определять порядок отображения предметов. Сначала будут добавлены элементы, добавленные сначала в список, а элементы, добавленные последними в список, будут отображаться поверх первых добавленных элементов. Таким образом, сначала добавьте уличные линии в свою панель или группу, а затем добавьте Text (или Labels) наверху улиц.

Другим вариантом является использование прямой ничьей Canvas, но для вашего приложения использование объектов графа сцены в панели или группе, вероятно, является лучшим подходом.

Используйте одну панель/группу со всеми добавленными улицами, а затем все имена или одну панель/группу для всех улиц, а другую для всех названий улиц. Отдельные панели могут быть приятными, потому что вы можете переключать видимость на названия улиц по мере необходимости, установив видимый флаг в группе имен улиц. Не используйте одну группу как для улицы, так и для ее имени, а затем попробуйте сложить несколько групп улиц + улиц друг над другом, иначе на перекрестках некоторые из названий улиц будут закрыты улицами, расположенными наверху.

Когда я рисую строку, я могу указать положение x, y, но я не могу установить положение текста или метки ... или я могу?

В дополнение к позиционированию линий, предоставляя им координаты при создании линии, вам также необходимо разместить текст так, чтобы он отображался поверх строк. Вы можете использовать метод text.relocate(x, y) для поиска текста в определенном месте.

+0

На каждой улице должна быть своя группа (улица + текст), не так ли? И чем мне нужно собрать эти группы в другую большую группу и поместить эту группу в пограничную панель? Но когда я попробовал это, текст был в другом месте, чем в строке ... Я добавил код в первом сообщении - это то, что вы имеете в виду? – damian

+0

Обновленный ответ для дальнейшего объяснения некоторых из этих концепций. – jewelsea

+0

Спасибо !!! Хорошо, я попробую это. Но когда я рисую строку, я могу указать позицию x, y, но я не могу установить позицию текста или метки ... или я могу? Я попробовал это: group.getChildren(). AddAll (текст, строка \t \t // и любая другая улица \t \t} и текст находится в другом месте, кроме улицы – damian

2

Я знаю, что это старая нить. Тем не менее, у меня был такой же вопрос: как добавить метки к линии, которая устойчива к перемещению линии arround. Этот код работает для меня:

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); 
Смежные вопросы