2016-06-25 2 views
1

Я пытаюсь создать прокручиваемую диаграмму, где ось Y остается в поле зрения независимо от положения курсора в полосе прокрутки (по умолчанию, поскольку информация о оси Y находится в конце от точки зрения, вы увидите его только после того, как вы выделите достаточно, чтобы увидеть конец)Линейная диаграмма прокрутки с фиксированным видом y ось JavaFX

Вот пример того, что им пытаются достичь:

enter image description here

Обратите внимание, что даже если позиция полосы прокрутки на полпути -through, текст оси Y (цена) все еще остается в поле зрения

Я просмотрел веб-сайт и смог найти только один пример чего-то подобного, но он, похоже, не работает с линейной диаграммой внутри scrollPane.

Always visible when scrolled anchored Node in Java FX 2.0?

Вышеперечисленные работы с объектом Circle, но изменения в диаграмму линии приведет в «Исключение: Связанное значение не может быть установлено», как это кажется автоматический вызов установлен макет при использовании линии диаграммы внутри scrollpane

public class FancyScrollPane extends Application { 
private LineChart<String, Number> qChart; 
@Override 
public void start(Stage primaryStage) { 
    ScrollPane scrollPane = new ScrollPane(); 
    Pane content = new Pane(); 
    final CategoryAxis xAxis = new CategoryAxis(); 
    final NumberAxis yAxis = new NumberAxis(12, 20, 1); 
    yAxis.setSide(Side.RIGHT); 
    qChart=new LineChart<String,Number>(xAxis, yAxis); 
    qChart.setPrefSize(3000, 250); 
    content.getChildren().add(qChart); 
    scrollPane.setContent(content); 


    Circle immovableObject = new Circle(30, Color.RED); 
    content.getChildren().add(immovableObject); 

    primaryStage.setScene(new Scene(scrollPane, 300, 300)); 
    primaryStage.show(); 

    yAxis.layoutXProperty().bind(
      scrollPane.hvalueProperty() 
       .multiply(
        content.widthProperty() 
         .subtract(
          new ScrollPaneViewPortWidthBinding(scrollPane)))); 
} 

// we need this class because Bounds object doesn't support binding 
private static class ScrollPaneViewPortWidthBinding extends DoubleBinding { 

    private final ScrollPane root; 

    public ScrollPaneViewPortWidthBinding(ScrollPane root) { 
     this.root = root; 
     super.bind(root.viewportBoundsProperty()); 
    } 

    @Override 
    protected double computeValue() { 
     return root.getViewportBounds().getWidth(); 
    } 
} 

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

Любые идеи, чтобы обойти вышеупомянутую проблему или лучший способ добиться этого?

Благодаря

ответ

0

Вот небольшая модификация, которая перемещает YAxis и круг с помощью полосы прокрутки с использованием метода setTranslateX, а не layoutXProperty.

import javafx.application.Application; 
import javafx.beans.binding.DoubleBinding; 
import javafx.scene.Scene; 
import javafx.scene.control.ScrollPane; 
import javafx.scene.layout.Pane; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Circle; 
import javafx.scene.shape.Rectangle; 
import javafx.stage.Stage; 

public class FancyScrollPane extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     ScrollPane scrollPane = new ScrollPane(); 
     Pane content = new Pane(); 
     scrollPane.setContent(content); 

     // adding background 
     content.getChildren().add(new Rectangle(500, 500, Color.GREEN)); 

     Circle immovableObject = new Circle(30, Color.RED); 
     content.getChildren().add(immovableObject); 

     primaryStage.setScene(new Scene(scrollPane, 300, 300)); 
     primaryStage.show(); 

     immovableObject.layoutXProperty().bind(
       scrollPane.hvalueProperty() 
         .multiply(
           content.widthProperty() 
             .subtract(
               new ScrollPaneViewPortWidthBinding(scrollPane)))); 
    } 

    // we need this class because Bounds object doesn't support binding 
    private static class ScrollPaneViewPortHeightBinding extends DoubleBinding { 

     private final ScrollPane root; 

     public ScrollPaneViewPortHeightBinding(ScrollPane root) { 
      this.root = root; 
      super.bind(root.viewportBoundsProperty()); 
     } 

     @Override 
     protected double computeValue() { 
      return root.getViewportBounds().getHeight(); 
     } 
    } 
    // we need this class because Bounds object doesn't support binding 
    private static class ScrollPaneViewPortWidthBinding extends DoubleBinding { 

     private final ScrollPane root; 

     public ScrollPaneViewPortWidthBinding(ScrollPane root) { 
      this.root = root; 
      super.bind(root.viewportBoundsProperty()); 
     } 

     @Override 
     protected double computeValue() { 
      return root.getViewportBounds().getWidth(); 
     } 
    } 
    public static void main(String[] args) { launch(); } 
} 
Смежные вопросы