在javaFX中创建滑动开/关切换按钮

时间:2015-06-02 10:12:21

标签: javafx

任何人都可以建议我使用JavaFX创建一个开/关切换按钮的方法,如下图所示。

enter image description here

我试图找到一种方法,但无法得到它。

2 个答案:

答案 0 :(得分:5)

<强>更新

ControlsFX有一个ToggleSwitch控件。

ToggleSwitch

我使用JavaFX创建了一个简单的ToggleSwitch。这是一个非常基本的模型,但会帮助您了解如何对自己的更复杂的控制。

以下是我的代码的gist

如果您想知道它的外观:

enter image description here

很少有其他ToggleSwitch可用(我从未尝试过):

  1. JFXtras
  2. JavaFX Metro Theme ToggleSwitch

答案 1 :(得分:1)

派对晚了4年,但也许更多的人迷失了这个问题。 I modified ItachiUchiha's code snippet a little.这是另一种设计,圆圈与条形重叠。

SwitchButton

import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;

public class SwitchButton extends StackPane {
    private final Rectangle back = new Rectangle(30, 10, Color.RED);
    private final Button button = new Button();
    private String buttonStyleOff = "-fx-effect: dropshadow(three-pass-box, rgba(0,0,0,0.2), 0.2, 0.0, 0.0, 2); -fx-background-color: WHITE;";
    private String buttonStyleOn = "-fx-effect: dropshadow(three-pass-box, rgba(0,0,0,0.2), 0.2, 0.0, 0.0, 2); -fx-background-color: #00893d;";
    private boolean state;

    private void init() {
        getChildren().addAll(back, button);
        setMinSize(30, 15);
        back.maxWidth(30);
        back.minWidth(30);
        back.maxHeight(10);
        back.minHeight(10);
        back.setArcHeight(back.getHeight());
        back.setArcWidth(back.getHeight());
        back.setFill(Color.valueOf("#ced5da"));
        Double r = 2.0;
        button.setShape(new Circle(r));
        setAlignment(button, Pos.CENTER_LEFT);
        button.setMaxSize(15, 15);
        button.setMinSize(15, 15);
        button.setStyle(buttonStyleOff);
    }

    public SwitchButton() {
        init();
        EventHandler<Event> click = new EventHandler<Event>() {
            @Override
            public void handle(Event e) {
                if (state) {
                    button.setStyle(buttonStyleOff);
                    back.setFill(Color.valueOf("#ced5da"));
                    setAlignment(button, Pos.CENTER_LEFT);
                    state = false;
                } else {
                    button.setStyle(buttonStyleOn);
                    back.setFill(Color.valueOf("#80C49E"));
                    setAlignment(button, Pos.CENTER_RIGHT);
                    state = true;
                }
            }
        };

        button.setFocusTraversable(false);
        setOnMouseClicked(click);
        button.setOnMouseClicked(click);
    }
}