2014-11-05 2 views
1

레이블과 VBox 만있는 간단한 컨트롤이 있습니다. 목적은 프로그램에서 사물을 사용자에게 알려주는 것입니다. 레이블을 장면과 적절하게 비율을 맞출 수 있도록 만들고 싶습니다.JavaFX : 장면/스테이지/창에서 컨트롤을 조절하는 적절한 방법은 무엇입니까?

public void reScaleX(){ 
    this.Message.setScaleX((//Message is the Label Variables name. 
     this.getWidth() - 40 //40 is the 20 + 20 padding given to the control. 
     )/this.Message.getBoundsInLocal().getWidth() 
    ); 
} 

public void reScaleY(){ 
    this.Message.setScaleY((
     this.getHeight() - 40 //40 is the 20 + 20 padding given to the control. 
     )/this.Message.getBoundsInLocal().getHeight() 
    ); 
} 

내가 초기화 방법의 컨트롤 너비 및 높이 속성에 리스너를 추가합니다 :

@Override public void initialize(URL location, ResourceBundle resources){ 
    this.widthProperty().addListener((
     ObservableValue<? extends Number> obsV, Number oldV, Number newV 
    ) -> this.reScaleX()); 
    this.heightProperty().addListener((
     ObservableValue<? extends Number> obsV, Number oldV, Number newV 
    ) -> this.reScaleY()); 
} 

그러나 문제는 내가 (어쨌든 내 생각)이 작업을 수행하는 장소의 방법이 그것이 이상하게 행동하는 것입니다 (때로는 재조정 될 것이고, 그렇지 않을 경우 다른 것). 또한 컨트롤이 컨트롤의 크기를 조정 때 재조정하기 위해 배치되고있는로 스테이지의 높이와 너비 속성에 리스너를 추가하려고했습니다 :

this.PreviewStage.widthProperty().addListener((
     ObservableValue<? extends Number> obsV, Number oldV, Number newV 
    ) -> 
     this.PreviewPlaque.reScaleX() 
    ); this.PreviewStage.heightProperty().addListener((
     ObservableValue<? extends Number> obsV, Number oldV, Number newV 
    ) -> 
     this.PreviewPlaque.reScaleY() 
    ); 

하지만 여전히 제대로 작동하지 것.

나는이 일을 잘못하고있는 것처럼 느낀다. 그러나 나는 그 일을 올바르게하는 법을 모른다. 이런 식으로 컨트롤을 다시 스케일하는 적절한 방법은 무엇입니까? 내가 찾고있는 결과를 얻기위한 더 좋은 방법이 있습니까?

+0

관련 항목 : [javafx 자동 크기 조정 및 버튼 패딩] (http://stackoverflow.com/questions/23229149/javafx-automatic-resizing-and-button-padding), [JavaFX 전체 화면 (크기 조정)] (http : //stackoverflow.com/questions/16606162/javafx-fullscreen) 및 [JavaFX correct scaling] (http : // stackoverflow.com/questions/16680295/javafx-correct-scaling) – jewelsea

답변

1

그래서 문제에 대한 내 해상도가 두 배이었다 내가 컨트롤을 확장하기 위해, 크기가 상대적으로 정적해야한다는 것을 기억 잊고 계속 : 즉, DO 최대 너비/너비를 큰 숫자로 설정하지 마십시오. 또한 컨트롤이 수직 또는 수평으로 커지지 않도록하십시오. 이것이 내 첫 번째 (가장 흔하고 좌절스러운 실수)입니다.

2 : scaleX 및 scaleY 속성을 바인딩 : 이는 상대적으로 최근에 속성 지식에 대한 상승에서 비롯된 것입니다. 규모 방법을 수행하는 데는 여러 가지 방법이 있지만 이것은 나에게 가장 깨끗하다고 ​​느낍니다.

this.Message.scaleXProperty().bind(Bindings.createDoubleBinding(() -> { 
    return (this.getWidth() - 40.0)/this.Message.getWidth(); 
}, this.widthProperty()) 
); this.Message.scaleYProperty().bind(Bindings.createDoubleBinding(() -> { 
    return (this.getHeight() - 40.0)/this.Message.getHeight(); 
}, this.heightProperty())); 

검토 대상 : 1 : 조절할 컨트롤의 크기는 고정적이어야합니다. 2 : scaleX 및 scaleY 속성을 바인딩합니다. phew.

3

라벨의 크기를 조절하면 상위에 레이아웃 효과가 적용되어 다시 너비/높이 속성이 변경되어 치명적인 레이아웃 재귀가 발생합니다.

나는 달성하고자하는 것을 100 % 확신하지 못했습니다.

가) 어떻게 든 사용 가능한 공간의 중앙에 텍스트 맞추기 :

void testLabelPlains1(VBox box) { 
    box.setFillWidth(true); 

    Label first = new Label("first"); 
    first.setAlignment(Pos.CENTER); 
    first.setMaxWidth(Double.MAX_VALUE); 
    first.setMaxHeight(Double.MAX_VALUE); 
    VBox.setVgrow(first, Priority.ALWAYS); 

    box.getChildren().addAll(first); 
} 

b)는 크기 조정 레이블 내에서 글꼴 크기 스케일 : 정말 linearily X의 텍스트 크기를 조절)

void testLabelPlains2(VBox box) { 
    box.setFillWidth(true); 

    Label first = new Label("first"); 
    first.setAlignment(Pos.CENTER); 
    first.setMaxWidth(Double.MAX_VALUE); 
    first.setMaxHeight(Double.MAX_VALUE); 
    VBox.setVgrow(first, Priority.ALWAYS); 

    first.heightProperty().addListener(p -> { 
     first.setFont(first.getFont().font(first.getHeight()*0.7)); 
    }); 

    box.getChildren().addAll(first); 
} 

C를/Y 방향

void testLabelPlains3(VBox box) {   
    Text first = new Text("first"); 

    box.heightProperty().addListener(p -> { 
     first.setScaleY(0.8*box.getHeight()/20); 
     first.setTranslateY(box.getHeight()/2); 
    }); 
    box.widthProperty().addListener(p -> { 
     first.setScaleX(0.8*box.getWidth()/30); 
     first.setTranslateX(box.getWidth()/2); 
    }); 

    box.getChildren().addAll(first); 
} 

... 물론 하드 코드 번호는 텍스트의 레이아웃 크기.

1 (가장 중요한) : 좋아

+0

C. 컨트롤의 크기가 변경되면 레이블의 크기가 변경되기를 원합니다. A와 B는 가까이 있지 않습니다. – Will

관련 문제