JavaFX UI控件教程(十七)之Slider

翻译自   Slider

在本章中,您将学习如何在JavaFX应用程序中使用滑块来显示和与一系列数值进行交互。

Slider控件由一个轨道和一个可拖动的拇指组成。它还可以包括刻度线和刻度标签,用于指示范围的数值。图16-1显示了一个典型的滑块并指出了它的主要元素。

图16-1滑块的元素

创建滑块

花点时间查看示例16-1中生成如图16-1所示滑块的代码片段。

示例16-1创建滑块

Slider slider = new Slider();
slider.setMin(0);
slider.setMax(100);
slider.setValue(40);
slider.setShowTickLabels(true);
slider.setShowTickMarks(true);
slider.setMajorTickUnit(50);
slider.setMinorTickCount(5);
slider.setBlockIncrement(10);

setMinsetMax方法定义,分别为最小和由滑块表示的最大数字值。该setValue方法指定滑块的当前值,该值始终小于最大值且大于最小值。使用此方法可以在应用程序启动时定义拇指的位置。

两个布尔方法,setShowTickMarkssetShowTickLabels定义滑块的视觉外观。在例16-1中,启用了标记和标签。此外,主刻度标记之间的单位距离设置为50,任意两个主刻度之间的次刻度数指定为5.您可以指定setSnapToTicks方法true以使滑块的值与刻度线对齐。

setBlockIncrement方法定义当用户点击轨道时拇指移动的距离。在示例16-1中,此值为10,这意味着每次用户单击轨道时,拇指会向点击位置移动10个单位。

在图形应用程序中使用滑块

现在查看图16-2。此应用程序使用三个滑块来编辑图片的渲染特征。每个滑块调整特定的视觉特性:不透明度级别,棕褐色调值或缩放系数。

图16-2三个滑块

例16-2显示了该应用程序的源代码。

实施例16-2滑块样品

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.effect.SepiaTone;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
 
public class Main extends Application {
 
    final Slider opacityLevel = new Slider(0, 1, 1);    
    final Slider sepiaTone = new Slider(0, 1, 1);
    final Slider scaling = new Slider (0.5, 1, 1);
    final Image image  = new Image(getClass().getResourceAsStream(
        "cappuccino.jpg")
    );
 
    final Label opacityCaption = new Label("Opacity Level:");
    final Label sepiaCaption = new Label("Sepia Tone:");
    final Label scalingCaption = new Label("Scaling Factor:");
 
    final Label opacityValue = new Label(
        Double.toString(opacityLevel.getValue()));
    final Label sepiaValue = new Label(
        Double.toString(sepiaTone.getValue()));
    final Label scalingValue = new Label(
        Double.toString(scaling.getValue()));
 
    final static Color textColor = Color.WHITE;
    final static SepiaTone sepiaEffect = new SepiaTone();
 
    @Override
    public void start(Stage stage) {
        Group root = new Group();
        Scene scene = new Scene(root, 600, 400);
        stage.setScene(scene);
        stage.setTitle("Slider Sample");
        scene.setFill(Color.BLACK);
 
        GridPane grid = new GridPane();
        grid.setPadding(new Insets(10, 10, 10, 10));
        grid.setVgap(10);
        grid.setHgap(70);
 
        final ImageView cappuccino = new ImageView (image);
        cappuccino.setEffect(sepiaEffect);
        GridPane.setConstraints(cappuccino, 0, 0);
        GridPane.setColumnSpan(cappuccino, 3);
        grid.getChildren().add(cappuccino);
        scene.setRoot(grid);
 
        opacityCaption.setTextFill(textColor);
        GridPane.setConstraints(opacityCaption, 0, 1);
        grid.getChildren().add(opacityCaption);
        
 
        opacityLevel.valueProperty().addListener(new ChangeListener<Number>() {
            public void changed(ObservableValue<? extends Number> ov,
                Number old_val, Number new_val) {
                    cappuccino.setOpacity(new_val.doubleValue());
                    opacityValue.setText(String.format("%.2f", new_val));
            }
        });
 
        GridPane.setConstraints(opacityLevel, 1, 1);
        grid.getChildren().add(opacityLevel);
 
        opacityValue.setTextFill(textColor);
        GridPane.setConstraints(opacityValue, 2, 1);
        grid.getChildren().add(opacityValue);
 
        sepiaCaption.setTextFill(textColor);
        GridPane.setConstraints(sepiaCaption, 0, 2);
        grid.getChildren().add(sepiaCaption);
 
        sepiaTone.valueProperty().addListener(new ChangeListener<Number>() {
            public void changed(ObservableValue<? extends Number> ov,
                Number old_val, Number new_val) {
                    sepiaEffect.setLevel(new_val.doubleValue());
                    sepiaValue.setText(String.format("%.2f", new_val));
            }
        });
        GridPane.setConstraints(sepiaTone, 1, 2);
        grid.getChildren().add(sepiaTone);
 
        sepiaValue.setTextFill(textColor);
        GridPane.setConstraints(sepiaValue, 2, 2);
        grid.getChildren().add(sepiaValue);
 
        scalingCaption.setTextFill(textColor);
        GridPane.setConstraints(scalingCaption, 0, 3);
        grid.getChildren().add(scalingCaption);
 
        scaling.valueProperty().addListener(new ChangeListener<Number>() {
            public void changed(ObservableValue<? extends Number> ov,
                Number old_val, Number new_val) {
                    cappuccino.setScaleX(new_val.doubleValue());
                    cappuccino.setScaleY(new_val.doubleValue());
                    scalingValue.setText(String.format("%.2f", new_val));
            }
        });
        GridPane.setConstraints(scaling, 1, 3);
        grid.getChildren().add(scaling);
 
        scalingValue.setTextFill(textColor);
        GridPane.setConstraints(scalingValue, 2, 3);
        grid.getChildren().add(scalingValue);
 
        stage.show();
    }
 
    public static void main(String[] args) {
        launch(args);
    }
}

ImageView对象的opacity属性根据名为opacityLevel的第一个滑块的值而更改。SepiaTone当sepiaTone滑块的值发生变化时,效果的级别会发生变化。第三个滑块通过传递给setScaleXsetScaleY滑块的当前值来定义图像的缩放因子。

例16-3中的代码片段演示了将类getValue方法返回的double值转换为的方法。它还应用格式将滑块的值渲染为浮点数,后面有两位数。SliderString

例16-3格式化渲染滑块的值

scalingValue.setText((Double.toString(value)).format("%.2f", value));

增强滑块外观的下一步是为其应用视觉效果或CSS样式。

相关的API文档  

猜你喜欢

转载自blog.csdn.net/moakun/article/details/83050711
今日推荐