В целом, мне нравится групповой подход, который вы изложили в своем вопросе. К сожалению, это не соответствует вашей конкретной ситуации, но для других, кто сталкивается с этим вопросом, это может быть предпочтительным решением для их применения.
Вы могли бы применить DropShadow эффект на ваш 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 произвольную форму, которую вы можете заполнить и погладить, чтобы в конечном итоге получить самый простой способ получить что-то самое близкое к тому, что вы хотите. При таком подходе у вас есть программный контроль над такими вещами, как линейные заглавные буквы, смягчение и настройки соединения линии для штриха цвета рамки.
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);
}
}
Проверьте это [вопрос] (http://stackoverflow.com/questions/28764190/javafx-line-fill-color/28765099#28765099). Вы можете преобразовать полилинию в набор строк и применить одно и то же решение. Но у вас будут проблемы с рендерингом в соединениях. –
Учитывая, что моя цель - остаться с единственным узлом Polyline, этот подход не сработает. Мне нужно решение, которое не включает разбиение узла на другие узлы или использование другого типа узла для его рендеринга. Чтобы быть ясным, если ответ «это невозможно», я бы предпочел услышать это, чем иметь решение, которое не соответствует моим требованиям. – ctg