2015-02-23 154 views
0

首先通過我的演示程序。如何基於其他面板的滾動條添加動態滾動條?

enter image description here

在上述圖像分量層級是 的JFrame將包含
調整JSplitPane
在這兩個分割[水平]有JFXPanels
每個JFXPanel包含滾動窗格[JavaFX的]

現在,您可以從圖像中看到右側面板包含JFXPanel內容的向上[與滾動條高度相同的值]的水平滾動條。
而在左側面板中沒有滾動條。

我的要求是在調整窗口大小時[通過最小化,最大化,拖動窗口......無論]面板的內容必須對齊。爲了這樣做,兩個面板都不應該有水平滾動條。

現在左側面板不能調整大小,因此在任何情況下調整窗口大小時,右側面板都會調整大小。

所以,當調整窗口大小時,我該如何識別滾動條應該添加到左側面板中?
此外,我知道如何添加滾動條,但重要的是我應該在哪裏放置代碼,以便它只在調整窗口大小時執行?

+0

是否綁定兩個「水平滾動條」的'visibilityProperty'幫助? – ItachiUchiha 2015-02-23 10:44:17

+0

綁定visibleProperty()將工作在ScrollBarPolicy.AS_NEEDED約束上。我的意思是我已經在垂直滾動條上實現了雙向綁定,它具有ScrollBarPolicy.ALWAYS約束...... – 2015-02-23 13:10:36

+0

反正我通過綁定visibleProperty()來嘗試,但它沒有工作。 – 2015-02-23 13:11:12

回答

0

這適用於我。這有點破綻:首先,你必須使用查找來獲得滾動條;我還必須假設ScrollPane實現只是設置滾動條的可見屬性來顯示/隱藏它(而不是從場景圖中添加和刪除它)。

這個例子是所有的JavaFX,沒有Swing,但我認爲它應該很容易轉換到你的上下文。我在Java 8下測試了它,我認爲它應該在Java 7下使用JavaFX 2進行編譯。

import javafx.application.Application; 
import javafx.beans.binding.Bindings; 
import javafx.geometry.Orientation; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.control.Control; 
import javafx.scene.control.Label; 
import javafx.scene.control.ScrollBar; 
import javafx.scene.control.ScrollPane; 
import javafx.scene.control.ScrollPane.ScrollBarPolicy; 
import javafx.scene.control.SplitPane; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

public class TwoScrollPanes extends Application { 

    @Override 
    public void start(Stage primaryStage) { 

     final SplitPane split = new SplitPane(); 
     final ScrollPane scrollPane1 = makeScrollPane(Control.USE_PREF_SIZE); 
     final ScrollPane scrollPane2 = makeScrollPane(250); 


     // if you want the vertical scrollbars to scroll in unison: 
     scrollPane1.vminProperty().bindBidirectional(scrollPane2.vminProperty()); 
     scrollPane1.vmaxProperty().bindBidirectional(scrollPane2.vmaxProperty()); 
     scrollPane1.vvalueProperty().bindBidirectional(scrollPane2.vvalueProperty()); 

     split.getItems().addAll(scrollPane1, scrollPane2); 

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

     Node rightHorizScroller = null ; 
     for (Node n : scrollPane2.lookupAll(".scroll-bar")) { 
      ScrollBar sb = (ScrollBar) n; 
      if (sb.getOrientation() == Orientation.HORIZONTAL) { 
       rightHorizScroller = sb ; 
      } 
     } 

     if (rightHorizScroller != null) { 
      scrollPane1.hbarPolicyProperty().bind(
        Bindings.when(rightHorizScroller.visibleProperty()) 
         .then(ScrollBarPolicy.ALWAYS) 
         .otherwise(ScrollBarPolicy.NEVER)); 
     } 
    } 

    private ScrollPane makeScrollPane(double minLabelWidth) { 
     ScrollPane scrollPane = new ScrollPane(); 
     VBox content = new VBox(); 
     for (int i = 1; i <= 100; i++) { 
      Label label = new Label("Item "+i); 
      label.setMinWidth(minLabelWidth); 
      content.getChildren().add(label); 
     } 
     scrollPane.setContent(content); 
     return scrollPane ; 
    } 

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