2016-10-25 6 views
0

Ich lerne über javafx ScrollBar. Ich weiß wenig über ScrollPane, aber ich möchte alle Kontrollen greifen. Hier habe ich versucht, javafx ScrollBar zu verwenden. aber es funktioniert nicht.Was ist Rule ScrollBar in JavaFX zu verwenden?

Hauptklasse:

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(); 
    } 
} 

Controller-Klasse:

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 Code:

<?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> 

Was sind die zu verwendenden Regeln ScrollBar? Auf welche Elemente könnte es zurückgreifen oder nicht?

Antwort

0

Das Problem hier ist das Elternteil, d.h. die GridPane. A GridPane setzt die Eigenschaft layoutX selbst. Wenn dies geändert wird, verschiebt während des nächsten Layoutpulses GridPane einfach die Node "zurück, wo es gehört".

Um dies zu erreichen, können Sie stattdessen die translateX-Eigenschaft verwenden. Die Eigenschaft translateX gibt die horizontale Entfernung an, um die der Knoten von seiner Layoutposition entfernt werden soll. Mit diesem Ansatz wäre es auch einfacher, die Eigenschaften zu binden, anstatt einen Zuhörer zu verwenden:

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

Alternativ könnten Sie einen Elternteil verwenden, das nicht auf die Layoutposition nicht gesetzt selbst (wie Pane) oder stellen Sie die managed Eigenschaft zu false, um zu verhindern, dass der Elternteil die Position und Größe des Kindes ändert. Beachten Sie, dass Sie in diesem Fall die layoutY selbst einstellen müssen, da diese Eigenschaft auch nicht von der Parent festgelegt wird.

+0

fabian können Sie den Unterschied zwischen layoutX und translateX erklären? Ich habe gesucht, aber die einfache Antwort für mich nicht gefunden. –

+0

@Nothing: 'layoutX' ist der Ort, an dem der Knoten platziert wird, bevor Transformationen angewendet werden; "Transformationseigenschaften", wie 'translateX' können ändern, wo/wie der Knoten tatsächlich gezeichnet wird. Wenn 'translateX' die einzige" Transformationseigenschaft "ist, beginnt die Position, die die Beschriftung für das Layout hat, bei' x = layoutX', aber die Position, an der sie tatsächlich gezeichnet wird, ist 'x = layoutX + translateX'; siehe auch ['Node.boundsInParent'] (https://docs.oracle.com/javase/8/javafx/api/javafx/scene/Node.html#boundsInParentProperty) – fabian

+0

Kannst du einen Blick darauf werfen? Ich zeichne ein Bild zum Verstehen. http://imgur.com/a/vRlOj Ich habe Recht? oder kannst du bitte ein solches Bild zeichnen? –

Verwandte Themen