2017-06-22 35 views
0

我在VBox(這是ScrollPane的內容)中有一個TextFlow對象,並且如果超過VBox(pref)寬度,我需要將其包裝。
我嘗試設置流的最大寬度:在VBox中包裹TextFlow

flow.maxWidthProperty().bind(vbox.prefWidthProperty()); 

但它不換行。我該怎麼做?提前致謝。

+1

你的問題是模糊的。你在VBox裏面有ScrollPane嗎?反之亦然。 TextFlow本身沒有wrap屬性,那麼「包裝TextFlow」是什麼意思? – ItachiUchiha

+1

發佈[MCVE]。如果'VBox'在'ScrollPane'內,'VBox'將隨着它的增長而增長,所以'TextFlow'也會增長。目前還不清楚你想要做什麼。 –

+0

抱歉誤會。由Label組成的TextFlow位於VBox內部,即ScrollPane的內容。如果流量達到VBox寬度,我需要換新線。 @James_D –

回答

1

默認情況下,滾動窗格將允許其內容增長到其首選大小,允許用戶滾動,如果它變得比分配的空間大。在你的情況下,作爲滾動窗格內容的VBox的首選寬度計算爲其子節點的首選寬度;這當然是文本流的首選寬度。反過來,文本流的首選寬度計算爲顯示其文本而不包裝所需的寬度。

聽起來好像你要做的是限制VBox,使它不能比包含它的滾動窗格更寬。您可以通過在滾動窗格上調用setFitToWidth(true);來完成此操作。這會導致滾動窗格的內容被調整大小,使其寬度等於滾動窗格視口的寬度,只要該內容的範圍在內容的minWidth-maxWidth之間。

這裏是一個SSCCE:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.ScrollPane; 
import javafx.scene.layout.VBox; 
import javafx.scene.text.Text; 
import javafx.scene.text.TextFlow; 
import javafx.stage.Stage; 

public class TextFlowInScrollPane extends Application { 


    @Override 
    public void start(Stage primaryStage) { 
     TextFlow flow = new TextFlow(new Text(text)); 
     VBox vbox = new VBox(flow); 
     ScrollPane scrollPane = new ScrollPane(vbox); 

     // removing this line will allow the scroll pane to grow 
     // to an unlimited width, and so will prevent the text from 
     // wrapping: 
     scrollPane.setFitToWidth(true); 

     Scene scene = new Scene(scrollPane, 400, 400); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

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

    private final String text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " 
      + "Duis malesuada nisi non est varius convallis. Donec eu aliquam tellus. " 
      + "Duis nulla nulla, mattis non dictum non, bibendum vel eros. " 
      + "Cras auctor metus eros, quis porta nisi mattis at. " 
      + "Aenean bibendum, elit nec suscipit imperdiet, lorem mauris cursus felis, " 
      + "sed suscipit quam nibh faucibus dui. Ut vel condimentum enim. " 
      + "Curabitur non lacinia nunc. Quisque ut arcu turpis. Maecenas enim risus, " 
      + "cursus eget auctor at, volutpat condimentum ligula. " 
      + "Aliquam rutrum consectetur sapien, non imperdiet nisi auctor quis. " 
      + "In hac habitasse platea dictumst. Nulla eget lacus ac quam dignissim varius. " 
      + "In hac habitasse platea dictumst. Proin quis pellentesque eros, nec semper nibh." 
      + "Integer venenatis aliquam risus volutpat tempor. Aliquam erat volutpat. " 
      + "Proin at viverra turpis. Sed luctus purus tortor, ut molestie libero tempus quis. " 
      + "Nulla eu viverra nulla. Vivamus ut bibendum lectus, eu lobortis tellus. " 
      + "Aliquam pellentesque ipsum ipsum. Sed vel pellentesque sapien, ut egestas arcu. " 
      + "Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. " 
      + "Curabitur sodales felis at justo congue pharetra. " 
      + "Curabitur sodales, urna a pulvinar consectetur, urna dolor rhoncus turpis, vel dapibus neque nisl a leo. " 
      + "Maecenas feugiat consequat tortor fermentum molestie. Donec a est et risus porttitor ornare. " 
      + "Cras auctor metus sed maximus fringilla. Donec blandit augue eu orci elementum malesuada. " 
      + "Aliquam volutpat, enim at lacinia sollicitudin, nibh nisi dignissim erat, " 
      + "sit amet accumsan orci lorem vitae nibh." 
      + "Maecenas interdum finibus laoreet. Mauris iaculis nibh nec dui lacinia, ut lacinia est venenatis. " 
      + "Donec vitae varius eros. Phasellus scelerisque eu risus ac bibendum. " 
      + "Morbi luctus, diam ut vehicula tristique, lacus mi ornare lacus, nec hendrerit nulla metus vitae mauris. " 
      + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas mattis luctus nisl non volutpat. " 
      + "Aenean euismod tristique libero sit amet dictum. Nulla facilisi. Aenean posuere dapibus convallis." 
      + "In vulputate mi quam, ut mattis felis iaculis sed. Phasellus eleifend nunc ex, " 
      + "vel commodo diam dictum at. Quisque posuere arcu ut lectus bibendum, non dapibus turpis luctus. " 
      + "Nullam quis arcu elit. In convallis rutrum nulla nec feugiat. Curabitur dapibus accumsan quam, " 
      + "ut faucibus orci posuere rhoncus. Integer vestibulum ex vitae sem elementum, a laoreet odio porta. " 
      + "Suspendisse malesuada cursus euismod. Duis a arcu erat. Integer eu nisi quis lectus convallis suscipit." 
      + "Pellentesque iaculis leo at dolor accumsan, nec fermentum urna maximus. " 
      + "Aenean ornare congue nisi, nec placerat ipsum. Morbi et pharetra turpis, vel accumsan lorem. " 
      + "Aenean tempus maximus velit, sed rutrum purus condimentum nec. Nunc sed aliquet turpis, ac aliquam justo. " 
      + "Curabitur lectus urna, facilisis ac sapien vel, lacinia pulvinar mauris. " 
      + "Cras venenatis, sapien maximus tincidunt luctus, lectus est auctor leo, id facilisis dui ex a ipsum. " 
      + "Duis a urna sed purus semper maximus accumsan non mi. " 
      + "Phasellus pharetra tempus sapien, in congue nisi ornare sed. " 
      + "Sed mollis, velit eu eleifend elementum, nisi lacus venenatis erat, " 
      + "pellentesque pulvinar augue diam eu ex. Maecenas non lacus mauris." 
      + "Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. " 
      + "Nam maximus eros urna. Vestibulum tempus condimentum nunc sit amet laoreet."; 


} 

enter image description here

+0

它仍然沒有換行,它在到達窗格的末尾時只是「剪輯」。我使用'vbox.getChildren()。add(flow);' –

+0

@GioG添加流程。不,它不。看截圖。你運行我的例子嗎? –

+0

對不起,我的意思是「包裝」。問題在於流程是在稍後創建的,而不是在@GioG的開始 –

-2

下面應該將文本包裝到下一行。

TextFlow tf = new TextFlow(); 
tf.setStyle("-fx-wrap-text: true"); 
+0

它沒有。也許我應該編輯這些框? –

+2

'TextFlow'不是'Labeled',因此不知道'-fx-wrap-text'。如果是這樣,那麼使用'tf.setWrapText(true)'''''''會比較安全,因爲當有替代選項時避免使用'.setStyle()'總是最好的。 – glglgl