2014-07-09 2 views
1

동일한 질문을 in oracle javafx forum에도 올렸지 만 답변을 얻지 못했습니다. 그래서 여기에 내 운을 시험해보십시오.TextArea 높이 관련 내용

텍스트 영역의 내용이 데이터베이스에서 동적으로 채워지는 요구 사항이 있습니다. 텍스트 영역의 데이터를 성공적으로 검색하고 표시 할 수 있습니다.

그러나 콘텐츠가 너무 크면 텍스트 영역의 높이를 동적으로 설정할 수 없습니다. 라벨을 동일하게 표시하려고하면 디스플레이가 완벽 해지고 콘텐츠 당 높이가 동적으로 설정됩니다. 그래서 같은 내용의 레이블을 만들고 아래 높이와 같이 높이를 동적으로 바인딩하려고 시도했지만 작동하지 않습니다.

// Generate User Note Description 
TextArea textArea = new TextArea(); 
Label text = new Label(); 

// SETTING THE TEXT TO A LABEL TO RETRIEVE THE HEIGHT 
text.setText(usrNotes.getNote().trim()); 

// ALWAYS DISPLAYS 0.0 
System.out.println("height::"+text.getHeight()); 

if (isMyNote) { 
    // ALWAYS SETS TO THE MINIMUM HEIGHT OF 60.0 
    textArea.setText(usrNotes.getNote().trim()); 
    textArea.setPrefWidth(Screen.getPrimary().getVisualBounds().getWidth() - 500.0); 
    textArea.setWrapText(true); 
    textArea.setMinHeight(60.0); 

    // WITHOUT THIS BINDING, DISPLAYS LOT OF EXTRA SPACE AFTER THE TEXT 
    textArea.prefHeightProperty().bind(text.heightProperty()); 
    textArea.setStyle("-fx-padding:0 5 2 1; -fx-font-size: 1.1em;-fx-background-color:white"); 
} else if (!isMyNote) { 

    // THIS IS PERFECT, AS EXPECTED SETS THE HEIGHT DYNAMICALLY 
    text.setText(usrNotes.getNote().trim()); 
    text.setStyle("-fx-padding:0 5 2 1;"); 
    text.setStyle("-fx-border-color: white;-fx-font-size: 1.1em;-fx-background-color:#F5F5F5;"); 
    text.setWrapText(true); 
    text.setPrefWidth(Screen.getPrimary().getVisualBounds().getWidth() - 500.0); 
    text.setMinHeight(60.0); 
} 

누군가가이 문제를 해결하는 방법에 대한 힌트를 제공 할 수 있다면 매우 감사하겠습니다.

덕분 이유를

답변

1

text.getHeight() 0을 반환 (따라서 text.heightProperty() 결합 할) 구성 요소를 생성 할 때의 높이가 계산되지 않기 때문이다 -sV. 구성 요소가 화면에 렌더링 될 때 계산됩니다.

높이를 계산하려면 FontMetrics (http://docs.oracle.com/javase/tutorial/2d/text/measuringtext.html)를 사용하여 문자열의 너비와 줄 높이를 계산하고 문자열을 토큰으로 분리하여 줄의 위치를 ​​파악해야한다고 생각합니다. (너비에 따라) 나누기가 끝나고 필요한 줄 수 (따라서 TextArea가 얼마나 높아야하는지)를 계산합니다.