2015-11-18 2 views
0

Как использовать линейный градиент для Строка в Javafx?
Я попытался это:Линейный градиент для линии в javafx

LinearGradient lg = new LinearGradient(...); 
line.setFill(lg); 
.... 

Это не работает.

+0

Проверьте это [ответ] (http://stackoverflow.com/a/28033436/3956070), и это [один] (http://stackoverflow.com/a/28765099/3956070). –

+0

Я просто хочу нарисовать линию, ее цвет меняется плавно от некоторого цвета (например, красного) на одном конце до другого (например, синего) на другом конце. Линия не является ни вертикальной, ни горизонтальной, ее направление произвольно. –

+0

Основываясь на этих ответах, вы сможете это сделать, но для этого требуется математика, чтобы генерировать градиент в зависимости от направления линии. –

ответ

0

Основываясь на этом answer, необходимо указать градиент на абсолютных координатах.

Что-то, как это будет работать для любых данных из них:

LinearGradient linearGradient = new LinearGradient(x1, y1, x2, y2, false, CycleMethod.REFLECT, new Stop(0,Color.RED),new Stop(1,Color.GREEN)); 
line.setStroke(linearGradient); 

Исходя из этого answer, вы можете создать простое приложение, чтобы проверить это, как она работает, когда вы перемещаете анкерные узлы вокруг сцены:

private final DoubleProperty x1 = new SimpleDoubleProperty(); 
public final double getX1() { return x1.get(); } 
public final void setX1(double value) { x1.set(value); } 
public final DoubleProperty x1Property() { return x1; } 

private final DoubleProperty x2 = new SimpleDoubleProperty(); 
public final double getX2() { return x2.get(); } 
public final void setX2(double value) { x2.set(value); } 
public final DoubleProperty x2Property() { return x2; } 

private final DoubleProperty y1 = new SimpleDoubleProperty(); 
public final double getY1() { return y1.get(); } 
public final void setY1(double value) { y1.set(value); } 
public final DoubleProperty y1Property() { return y1; } 

private final DoubleProperty y2 = new SimpleDoubleProperty(); 
public final double getY2() { return y2.get(); } 
public final void setY2(double value) { y2.set(value); } 
public final DoubleProperty y2Property() { return y2; } 

private Line line; 

@Override 
public void start(Stage primaryStage) { 
    Group group = new Group(); 
    primaryStage.setScene(new Scene(group, 400, 400)); 

    x1.set(100); 
    y1.set(50); 
    x2.set(200); 
    y2.set(300); 

    line = new Line(x1.get(), y1.get(), x2.get(), y2.get()); 
    line.startXProperty().bind(x1); 
    line.startYProperty().bind(y1); 
    line.endXProperty().bind(x2); 
    line.endYProperty().bind(y2); 
    line.setStrokeWidth(12); 
    line.setMouseTransparent(true); 

    Anchor start = new Anchor(Color.BLUE, x1, y1); 
    Anchor end = new Anchor(Color.YELLOW, x2, y2); 

    group.getChildren().setAll(line, start, end); 

    x1Property().addListener(o -> updateLine()); 
    x2Property().addListener(o -> updateLine()); 
    y1Property().addListener(o -> updateLine()); 
    y2Property().addListener(o -> updateLine()); 
    updateLine(); 

    primaryStage.show(); 
} 

private void updateLine() { 
    LinearGradient linearGradient = new LinearGradient(x1.get(), y1.get(), x2.get(), y2.get(), false, CycleMethod.REFLECT, new Stop(0,Color.RED),new Stop(1,Color.GREEN)); 
    line.setStroke(linearGradient); 
} 

private class Anchor extends Circle { 

    Anchor(Color color, DoubleProperty x, DoubleProperty y) { 
     super(x.get(), y.get(), 10); 
     setFill(color.deriveColor(1, 1, 1, 0.5)); 
     setStroke(color); 
     setStrokeWidth(2); 
     setStrokeType(StrokeType.OUTSIDE); 

     x.bind(centerXProperty()); 
     y.bind(centerYProperty()); 
     enableDrag(); 
    } 

    // make a node movable by dragging it around with the mouse. 
    private void enableDrag() { 
     final Delta dragDelta = new Delta(); 
     setOnMousePressed(mouseEvent -> { 
      // record a delta distance for the drag and drop operation. 
      dragDelta.x = getCenterX() - mouseEvent.getX(); 
      dragDelta.y = getCenterY() - mouseEvent.getY(); 
      getScene().setCursor(Cursor.MOVE); 
     }); 
     setOnMouseReleased(mouseEvent -> { 
      getScene().setCursor(Cursor.HAND); 
     }); 
     setOnMouseDragged(mouseEvent -> { 
      double newX = mouseEvent.getX() + dragDelta.x; 
      if (newX > 0 && newX < getScene().getWidth()) { 
       setCenterX(newX); 
      } 
      double newY = mouseEvent.getY() + dragDelta.y; 
      if (newY > 0 && newY < getScene().getHeight()) { 
       setCenterY(newY); 
      } 
     }); 
     setOnMouseEntered(mouseEvent -> { 
      if (!mouseEvent.isPrimaryButtonDown()) { 
       getScene().setCursor(Cursor.HAND); 
      } 
     }); 
     setOnMouseExited(mouseEvent -> { 
      if (!mouseEvent.isPrimaryButtonDown()) { 
       getScene().setCursor(Cursor.DEFAULT); 
      } 
     }); 
    } 

    // records relative x and y co-ordinates. 
    private class Delta { double x, y; } 
} 

Linear Gradient

+0

Вы действительно помогаете !!! Это именно то, чего я хочу. Я не должен использовать метод _setFill() _. Вы сказали, что «нужны математика», что это значит? –

+0

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

0

Используйте этот

line.setStyle("-fx-background-color: linear-gradient(to right, #color_1, #color_2);"); 
+0

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

Смежные вопросы