【问题标题】:scrollbar changing the width of an image滚动条改变图像的宽度
【发布时间】:2016-06-25 18:42:03
【问题描述】:

我要去学校学习java编程。我收到了一个程序,我必须使用滚动条来更改 imageView 的宽度。我的问题是,JavaFX 中的滚动条 API 甚至可以实现吗?

好的,这是我的代码。

    sb = new ScrollBar();
    sb.setMax(100);
    sb.setMin(0);

    lastValue = 500;
    sb.setValue(lastValue);
    sb.setUnitIncrement(1);
    sb.blockIncrementProperty();
    sb.setOnScroll(e -> FacePart.getPart().scrollAction(lastValue));

这就是我遇到问题的地方。在此代码所在的类和我在另一个类中的方法之间来回通信。 这是另一个类中的方法。

其他方法

@Override
public void scrollAction(double j) {
    /*Global variable*/ lastScrollValue = j;
    iv.setFitWidth(300 + 2 * lastScrollValue);
}

【问题讨论】:

  • 不知道 JavaFX API,我无能为力 - 但发布代码说明您已经尝试过哪些步骤以及为什么它们不适合您,这可能对您有所帮助。
  • 这样好还是你需要这两个类的所有代码?
  • 不幸的是,我对这类东西非常不熟悉,但额外的信息会帮助其他人。

标签: java image javafx width scrollbar


【解决方案1】:

这可以完成,但不应该使用onScroll 事件来完成。

改为将ChangeListener 添加到value property

sb.valueProperty().addListener((observable, oldValue, newValue) -> {
    FacePart.getPart().scrollAction(newValue.doubleValue());
});

或者干脆使用绑定:

iv.fitWidthProperty().bind(sb.valueProperty().multiply(2).add(300));

至少我猜这就是你想要做的。我不确定你为什么会在那里使用“全局”。

此外:

sb.blockIncrementProperty();

在这里实际上是一个 NOP。 如果您需要设置(或获取)该值,则应使用提供的 setter(或 getter):

sb.setBlockIncrement(someValue);

通过属性执行此操作的可读性较差,但效果相同。

通常您也会为此使用Slider(因为在这种情况下,句柄大小似乎没有意义)。

【讨论】:

    【解决方案2】:

    我同意 Fabian 的观点,只需使用 Slider 完成此任务,而不是 ScrollBar。 Slider 是更合适的控件。

    import javafx.application.Application;
    import javafx.geometry.Insets;
    import javafx.scene.Scene;
    import javafx.scene.control.Slider;
    import javafx.scene.image.*;
    import javafx.scene.layout.*;
    import javafx.stage.Stage;
    
    public class SmurfObesityMeter extends Application {
        private static final double DEFAULT_SIZE = 128;
        private static final double MIN_WIDTH = DEFAULT_SIZE / 2;
        private static final double MAX_WIDTH = DEFAULT_SIZE * 2;
    
        @Override
        public void start(final Stage stage) throws Exception {
            final Image image = new Image(IMAGE_LOC);
            final ImageView imageView = new ImageView(image);
    
            StackPane imagePane = new StackPane(imageView);
            imagePane.setMinSize(StackPane.USE_PREF_SIZE, StackPane.USE_PREF_SIZE);
            imagePane.setPrefSize(MAX_WIDTH, DEFAULT_SIZE);
            imagePane.setMaxSize(StackPane.USE_PREF_SIZE, StackPane.USE_PREF_SIZE);
    
            final Slider slider = new Slider(MIN_WIDTH, MAX_WIDTH, DEFAULT_SIZE);
            imageView.fitWidthProperty().bind(slider.valueProperty());
    
            final VBox layout = new VBox(10, imagePane, slider);
            layout.setPadding(new Insets(10));
            stage.setScene(new Scene(layout));
            stage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    
        private static final String IMAGE_LOC =
            "http://icons.iconarchive.com/icons/designbolts/smurfs-movie/128/smurfette-icon.png";
    }
    

    【讨论】:

    猜你喜欢
    • 2012-08-31
    • 2011-06-03
    • 2010-09-20
    • 2016-11-24
    • 1970-01-01
    • 2019-11-11
    • 2014-01-13
    相关资源
    最近更新 更多