2014-12-11 2 views
1

질문이 있습니다. 아크 길이가 바뀌고 그 경계선 안에 호가 있어야하는 어플리케이션을 만들고 있습니다. 그러나 아크의 길이를 변경할 때 중심에 오게되어 채워지는 원처럼 보이지 않습니다. 사실 내가 원하는 것은 호이며 최대 길이 (360)만큼 위치를 계산합니다 (경계선의 중심). 누군가이 문제를 해결해 줄 수 있습니까? 대단히 감사합니다.JavaFX 센터는 테두리 창에 크기를 조정할 수있는 호를 중심으로합니다.

+0

arcimage

는 StackPane에서 아크가 아닌 BorderPane를 넣습니다. – jewelsea

+0

StackPane을 사용하면 작동하지 않았지만 계속 일정 시간 동안 중앙에 위치하므로 채워지는 원 모양이 아닙니다. –

+0

어떻게 든이 문제를 해결 했습니까? – Zavael

답변

1

그룹 만들기. 그룹에 전체 원 크기 인 직사각형 (예 : 사각형의 높이와 너비는 원의 지름으로 설정)을 배치 한 다음 원호 반경을 원호 배치 위치로 설정하여 그룹에 호를 추가합니다. 고정 된 크기의 그룹이 크기를 조정할 수있는 영역의 가운데에 있도록 스택 패널에 그룹을 배치합니다. StackPane을 BorderPane의 중앙에 배치합니다. StackPane의 최소 크기를 0으로 설정하여 그룹보다 작은 크기로 그룹을 유지하고 그룹을 가시 범위 내에서 가운데로 유지합니다. BorderPane의 밑바닥에 컨트롤을 추가해 아크의 길이를 동적으로 제어 할 수 있도록 (듯이)합니다.

import javafx.application.Application; 
import javafx.geometry.Insets; 
import javafx.scene.*; 
import javafx.scene.control.Slider; 
import javafx.scene.layout.*; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.*; 
import javafx.stage.Stage; 

public class ArcControl extends Application { 
    @Override 
    public void start(Stage stage) throws Exception { 
     CenteredArc centeredArc = new CenteredArc(); 
     ArcControls arcControls = new ArcControls(centeredArc.getArc()); 

     BorderPane layout = new BorderPane(); 
     layout.setCenter(centeredArc.getArcPane()); 
     layout.setBottom(arcControls.getControlPane()); 

     stage.setScene(new Scene(layout)); 
     stage.show(); 
    } 

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

class CenteredArc { 
    private static final double INSET = 10; 

    private static final double ARC_RADIUS = 100; 
    private static final double INITIAL_ARC_LENGTH = 60; 
    private static final double ARC_STROKE_WIDTH = 10; 
    private static final double ARC_REGION_SIZE = 
      ARC_RADIUS * 2 + ARC_STROKE_WIDTH + INSET * 2; 

    private final Arc arc; 
    private final Pane arcPane; 

    public CenteredArc() { 
     // Create the arc. 
     arc = new Arc(
       ARC_REGION_SIZE/2, ARC_REGION_SIZE/2, 
       ARC_RADIUS, ARC_RADIUS, 
       0, 
       INITIAL_ARC_LENGTH 
     ); 
     arc.setStrokeWidth(10); 
     arc.setStrokeLineCap(StrokeLineCap.ROUND); 
     arc.setStroke(Color.FORESTGREEN); 
     arc.setFill(Color.POWDERBLUE); 

     // Create a background fill on which the arc will be centered. 
     // The paint of the background fill can be set to Color.TRANSPARENT 
     // if you don't want the fill to be seen. 
     final double fillSize = ARC_RADIUS * 2 + arc.getStrokeWidth() + INSET * 2; 
     Rectangle fill = new Rectangle(fillSize, fillSize, Color.PINK); 

     // Place the fill and the arc in the group. 
     // The Group will be a fixed sized matching the fill size. 
     Group centeredArcGroup = new Group(fill, arc); 

     // place the arc group in a StackPane so it is centered in a resizable region. 
     arcPane = new StackPane(centeredArcGroup); 
     arcPane.setPadding(new Insets(INSET)); 
     arcPane.setMinSize(0, 0); 
     arcPane.setStyle("-fx-background-color: papayawhip;"); 
    } 

    public Arc getArc() { 
     return arc; 
    } 

    public Pane getArcPane() { 
     return arcPane; 
    } 
} 

// helper class which can use a slider to control an arc. 
class ArcControls { 
    private static final double INSET = 10; 

    private final Slider slider; 
    private final VBox controlPane; 

    public ArcControls(Arc arc) { 
     slider = new Slider(0, 360, arc.getLength()); 
     controlPane = new VBox(
       slider 
     ); 
     controlPane.setPadding(
       new Insets(INSET) 
     ); 
     controlPane.setStyle(
       "-fx-background-color: palegreen;" 
     ); 

     arc.lengthProperty().bind(slider.valueProperty()); 
    } 

    public Slider getSlider() { 
     return slider; 
    } 

    public VBox getControlPane() { 
     return controlPane; 
    } 
} 
2

BorderPane (또는 StackPane)의 내부는 모양의 경계 상자 (왼쪽 위, 가운데, 아래 등)에 따라 정렬됩니다. 따라서 원호의 중심점이 이동하고 원하는 효과를주지 못합니다.

대신 호를 AnchorPane에 배치하십시오. BorderPane을 사용하려면 AnchorPane을 BorderPane의 영역 (왼쪽, 오른쪽, 가운데 등)에 넣으십시오. 호 길이를 변경하고 원호 길이가 증가하는 원의 효과를 제공하더라도 호의 중심점을 수정합니다.

+0

안녕하세요, 당신의 예제를 시도했지만 작동하지 않습니다. Angle을 0.0으로 설정 한 후 Anchor pane의 왼쪽 상단에 호가 정렬되었거나 totaly가 잘못 배치되었습니다. 호로 도형을 정확하게 쌓아 올리는 방법에 대한 몇 가지 fxml을 보여주십시오. – Zavael

+0

늦게 답장을 드려 죄송합니다. 다음은 장면 빌더로 만든 fxml에 대한 [link] (http://pastebin.com/GxMBhx7j)입니다. 희망이 도움이 될 것입니다. –

+0

고마워요, 고맙겠 습니다만, 그 동안 나는 동적으로 layoutX를 호에 할당해야한다는 것을 이미 알아 냈습니다 - 그것은 일종의 패딩이고 아크가 90도보다 낮 으면 다른 것이되어야합니다 , 아크가 90-180 도인 경우 다른, 그리고 더 클 경우 – Zavael

관련 문제