2016-10-25 12 views
0

私はjavafx ScrollBarについて学んでいます。私はScrollPaneについて少し知っているが、私はすべてのコントロールを把握したい。ここではjavafx ScrollBarを使用しようとしました。それは動作していません。JavaFXでScrollBarを使用するルールとは何ですか?

メインクラス:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.Parent; 
import javafx.stage.Stage; 
import javafx.fxml.FXMLLoader; 
import java.io.IOException; 

public class ScrollBarExample extends Application{ 
    @Override 
    public void start(Stage stage)throws IOException { 
     Parent root = FXMLLoader.load(getClass().getResource("scroll.fxml")); 
     Scene scene = new Scene(root); 
     stage.setScene(scene); 
     stage.show(); 
    } 
} 

コントローラクラス:

import javafx.scene.control.Label; 
import javafx.scene.control.ScrollBar; 
import javafx.fxml.FXML; 
import javafx.beans.value.ChangeListener; 
import javafx.beans.value.ObservableValue; 

public class ScrollController{ 
    @FXML private Label label; 
    @FXML private ScrollBar scroll; 

    public void initialize(){ 
     scroll.valueProperty().addListener(new ChangeListener<Number>(){ 
      @Override 
      public void changed(ObservableValue<? extends Number> value, Number oldValue, Number newValue){ 
       label.setLayoutX(newValue.doubleValue()); 
      } 
     }); 
    } 
} 

FXMLコード:

<?import javafx.scene.layout.GridPane?> 
<?import javafx.scene.control.ScrollBar?> 
<?import javafx.scene.layout.Pane ?> 
<?import javafx.scene.control.Label ?> 

<GridPane prefWidth="300" prefHeight="250" xmlns:fx="http://javafx.com/fxml" fx:controller="ScrollController" > 
    <children> 
     <ScrollBar fx:id="scroll" min="0" max="100" GridPane.rowIndex="0" GridPane.columnIndex="0" /> 
     <Label fx:id="label" text="Move Me" GridPane.rowIndex="1" GridPane.columnSpan="2" GridPane.columnIndex="0" /> 
    </children> 
</GridPane> 

だから何ScrollBarを使用するルールはありますか?それはどの要素で使うことができますか?

答えて

0

ここで問題となるのは親です。すなわち、GridPaneです。 GridPaneは、layoutXプロパティ自体を設定します。これが変更された場合、次のレイアウトパルスの間にGridPaneNodeを単に「所属先に戻す」ように移動します。

この作業を行うには、代わりにtranslateXプロパティを使用します。 translateXプロパティは、ノードをレイアウト位置から移動する水平距離を示します。このアプローチでは、また、代わりに、リスナーを使用してのプロパティをバインドするために容易になるだろう:

label.translateXProperty().bind(scroll.valueProperty()); 

また、レイアウト位置自体を設定する(Paneなど)またはmanagedを設定していない親を使用することができますプロパティをfalseに設定して、親が子の位置とサイズを変更しないようにします。この場合、Parentで設定されていないため、layoutYを自分で設定する必要があります。

+0

fabian layoutXとtranslateXの違いを説明できますか?私は検索しましたが、私には簡単な答えが見つかりませんでした。 –

+0

@Nothing: 'layoutX'は、変換が適用される前にノードが置かれる場所です。 'translateX'のような「変換プロパティ」は、ノードが実際にどこで描画されたかを変更することができます。 'translateX'が唯一の"変換プロパティ "セットである場合、そのラベルがレイアウトのために持つ位置は' x = layoutX'から始まりますが、実際に描画される位置は 'x = layoutX + translateX'です。 ['Node.boundsInParent'](https://docs.oracle.com/javase/8/javafx/api/javafx/scene/Node.html#boundsInParentProperty) – fabian

+0

こちらをご覧ください。私は理解するためにイメージを描きます。 http://imgur.com/a/vRlOjよろしいですか?あなたはそのようなイメージを描くことができますか? –

関連する問題