2016-04-13 3 views
1

У меня есть форма, которую я бы хотел отобразить как JavaFX Polyline, но с несколькими цветами в штрихе. По существу, это была бы синяя линия шириной 8 пикселей с черной рамкой шириной 2 пикселя по обе стороны от нее. Я могу достичь того же эффекта, создавая Group, а затем добавить два Polylines в Group:Настроить штрих полилинии JavaFX

Group group = new Group(); 
double[] coords = ... 

Polyline bg = new Polyline(coords); 
bg.setStroke(Color.BLACK); 
bg.setStrokeWidth(12); 

Polyline fg = new Polyline(coords); 
fg.setStroke(Color.BLUE); 
fg.setStrokeWidth(8); 

group.getChildren().add(bg); 
group.getChildren().add(fg); 

Таким образом, в то время как делает так, как я хочу, теперь у меня есть Group, а не Polyline, так что я могу Не рассматривайте его как Shape. Я не вижу способа указать пользовательский механизм рисования, так есть ли способ сделать это?

+0

Проверьте это [вопрос] (http://stackoverflow.com/questions/28764190/javafx-line-fill-color/28765099#28765099). Вы можете преобразовать полилинию в набор строк и применить одно и то же решение. Но у вас будут проблемы с рендерингом в соединениях. –

+0

Учитывая, что моя цель - остаться с единственным узлом Polyline, этот подход не сработает. Мне нужно решение, которое не включает разбиение узла на другие узлы или использование другого типа узла для его рендеринга. Чтобы быть ясным, если ответ «это невозможно», я бы предпочел услышать это, чем иметь решение, которое не соответствует моим требованиям. – ctg

ответ

1

В целом, мне нравится групповой подход, который вы изложили в своем вопросе. К сожалению, это не соответствует вашей конкретной ситуации, но для других, кто сталкивается с этим вопросом, это может быть предпочтительным решением для их применения.


Вы могли бы применить DropShadow эффект на ваш PolyLine генерировать цвет границы. Это приведет к слегка закругленным краям для углов, что может быть или не быть тем, что вы хотите.

polyline

import javafx.application.Application; 
import javafx.scene.*; 
import javafx.scene.effect.*; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Polyline; 
import javafx.stage.Stage; 

public class Polyanna extends Application { 
    @Override 
    public void start(Stage stage) { 
     Polyline polyline = new Polyline(); 
     polyline.getPoints().addAll(50.0, 50.0, 
       200.0, 100.0, 
       100.0, 200.0 
     ); 
     polyline.setStrokeWidth(8); 
     DropShadow borderEffect = new DropShadow(
       BlurType.THREE_PASS_BOX, Color.BLUE, 2, 1, 0, 0 
     ); 
     polyline.setEffect(borderEffect); 

     stage.setScene(
       new Scene(
         new Group(polyline), 
         250, 250 
       ) 
     ); 
     stage.show(); 
    } 

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

Альтернативный вариант нарисовать Polygon с заливкой и обводкой, а не полилинии. Вы можете написать подпрограмму, которая принимает массив точек для полилинии и генерирует соответствующий массив точек для многоугольника из этого входного массива (с небольшим количеством работы ;-)


можно использовать для создания shape intersection capabilities произвольную форму, которую вы можете заполнить и погладить, чтобы в конечном итоге получить самый простой способ получить что-то самое близкое к тому, что вы хотите. При таком подходе у вас есть программный контроль над такими вещами, как линейные заглавные буквы, смягчение и настройки соединения линии для штриха цвета рамки.

shape intersect

import javafx.application.Application; 
import javafx.scene.*; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.*; 
import javafx.stage.Stage; 

public class PolyIntersect extends Application { 
    private static final double W = 250; 
    private static final double H = 250; 

    @Override 
    public void start(Stage stage) { 
     Polyline polyline = new Polyline(); 
     polyline.getPoints().addAll(50.0, 50.0, 
       200.0, 100.0, 
       100.0, 200.0 
     ); 
     polyline.setStrokeWidth(8); 
     Rectangle bg = new Rectangle(0, 0, W, H); 
     Shape shape = Shape.intersect(bg, polyline); 
     shape.setFill(Color.BLACK); 
     shape.setStroke(Color.BLUE); 
     shape.setStrokeType(StrokeType.OUTSIDE); 
     shape.setStrokeWidth(2); 

     stage.setScene(
       new Scene(
         new Group(shape), 
         W, H 
       ) 
     ); 
     stage.setResizable(false); 
     stage.show(); 
    } 

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

DropShadow - именно то, что я искал. Благодаря! – ctg