2014-01-14 1 views
1

JavaFX로 시작하기 때문에 실수를 저 지르지 마십시오.prefWidth = "Infinity"인 GridPane의 단추 JavaFX

나는 두 개의 버튼을 서로 옆으로 늘려 창 전체 너비에 걸쳐 사용하고자하는 GridPane을 가지고 있습니다. 그래서 한 행과 두 개의 열로 GridPane을 만들고 두 개의 버튼에 추가했습니다. 그것에 대해

코드 :

<GridPane id="GridPane" alignment="TOP_LEFT" disable="false" gridLinesVisible="false" hgap="5.0"> 
    <children> 
    <Button mnemonicParsing="false" styleClass="add-button" text="Save" GridPane.columnIndex="0" GridPane.rowIndex="0" /> 
    <Button mnemonicParsing="false" text="Discard" GridPane.columnIndex="1" GridPane.rowIndex="0" /> 
    </children> 
    <columnConstraints> 
    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" /> 
    <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" /> 
    </columnConstraints> 
    <rowConstraints> 
    <RowConstraints minHeight="10.0" vgrow="SOMETIMES" /> 
    </rowConstraints> 
</GridPane> 

하지만 지금은 버튼 만 자신의 필요 공간을 차지합니다. 그래서 나는 그들 모두에 prefWidth="Infinity"을 추가했다. 그 결과 Secene Builder 1.1이 즉시 멈 춥니 다. 나는 장면 빌더 (Scene Builders)가 버그가 있고 아마도 버그가 있다고 들었고 그래서 그것을 손으로 FXML에 코드화하고 프로그램을 실행하려고 시도했다. 프로그램이 시작되지만 창을 열지 않습니다.

jvisualvm으로 실행중인 프로세스를 검사하면 JavaFX 응용 프로그램 스레드가 엄청난 양의 공간을 할당하고 있음을 알 수 있습니다 (수천 개의 ArrayList은 즉시 가비지 수집됩니다). 약 1.2GB/s를 할당합니다. 장면 빌더는 사용 된 힙이 약 16MB 정도로 일정하여 (창을 열지 않음) 파일을 열려고 할 때 아무 것도하지 않는 것처럼 보입니다.

ButtonprefWidth 만 추가 된 경우에도 오류가 발생합니다. 예를 들어 두 단추 모두에 prefWidth="100000000"을 사용하면 원하는 결과를 얻지 만 이것이 실제로 잘못된 코딩이라고 느낍니다.

그래서 제 질문은 다음과 같습니다

  • 이 자바 FX의 오류인가?
  • 원하는 결과를 더 좋은 방법으로 얻는 방법은 무엇입니까?

답변

3

prefWidth가 아닌 maxWidth를 사용해야합니다. JavaFX는 선호하는 크기이므로 버튼의 초기 크기로 MAX 값을 계산하려고합니다. 최대 크기는 실제 크기와 실제 크기를 비교하는 데 사용되는 매개 변수입니다 (경우에 따라 크기를 최소로 설정 (실제 크기가 충분히 크지 않은 경우 : 최소 크기로 늘리기) 또는 최대 값 (실제 크기가 너무 큼) : 최대 크기로 축소)), 아마도 필요한 것입니다. '무한대'값을 가진 maxWidth/maxHeight는 위젯의 성장을 제한하지 않는다는 것을 의미합니다.

기본적으로 최대 크기는 prefSize와 같으므로 올바른 HGROW/VGROW를 갖도록 수정해야합니다. 어느 시점에서 올바른 것이 었습니다. 최대 크기를 수정해야하지만 프리퍼런스 크기는 변경하지 마십시오. 이 같은

뭔가 작동합니다 :

<Button fx:id="testButton" 
     text="Test" 
     maxWidth="Infinity" 
     maxHeight="Infinity" 
     GridPane.hgrow="ALWAYS" 
     GridPane.vgrow="ALWAYS" 
     GridPane.rowIndex="0" 
     GridPane.columnIndex="0"/> 
+0

확인 설정'의 maxWidth = "무한대"'참으로 내 문제를 해결 않습니다. 그러나 나는 당신의 설명을 완전히 이해하지 못합니다. 내가 보는 방법은'maxWidth = "Infinity"를 설정하는 것입니다. JavaFX에 "기본적으로 내 너비에는 상한선이 없습니다"라고 설정하고'prefWidth = "Infinity"를 설정함으로써 이봐 요. 나는 거대하게되고 싶습니다. 너비 (그러나 그것은 요구 사항은 아닙니다) "JavaFX가 절약 할 수있는만큼의 공간을 제공하기로 결정할 수 있습니다. 그러나 이것은 어떻게 든 에러 메시지 나 아무것도없이 전체 과정을 깨뜨린다. – mgttlinger

+0

또한 'maxWidth'가 기본값 당'prefWidth'와 같은 경우 왜 작동하지 않습니까? – mgttlinger

+0

@mgttlinger prefSize는 '추상'값을 가지지 않으므로 픽셀 단위로 명시 적으로 지정해야합니다. 가능한 경우 javafx는 해당 값을 위젯에 사용합니다. '무한'은 성장을 표현하는 바로 가기이므로 비교 가치로만 사용해야합니다.javafx가 Integer.MAX_VALUE를 사용하여 widget을 그려서 prev 너비로 만들었다 고 생각합니다. 그러면 JVM이 종료됩니다. – zenbeni

관련 문제