我认为根据您的描述,您实际上想要的是 ToggleButton 而不是标准的 Button。
ToggleButtons 上有一个不错的 Oracle 教程。
解决问题中的项目
出现深蓝色光晕表明它已被点击
蓝色光环实际上是一个焦点环,表示控件具有焦点。
要聚焦一个控件,您可以调用requestFocus 方法。
在事件过程中,我的程序可能想要“取消单击”它以显示它不再被选中。
要从控件中移除焦点,您可以在另一个控件上调用 requestFocus 以改为关注该控件。
我期待一个 button.setSelected(false);
要拥有一个可以在选中和未选中状态之间切换的按钮,请使用ToggleButton。 ToggleButton 有一个 setSelected 方法。
setEffect(new DropShadow()) 使用 setStyle() 是可以的,但是要使用什么值
阴影效果的 css 样式值在 JavaFX CSS Reference Guide 中定义。
在代码中通过setEffect 或通过setStyle 的css 或应用样式表中的样式类来定义投影效果在视觉上是等效的。在这三种方法中,我绝不会推荐setStyle 方法,而只推荐样式表中的css 或代码方法中的setEffect。
相关
注意还有一个额外的相关属性 - armed:
表示按钮已被“武装”,因此鼠标释放将导致按钮的动作被调用。这与压制略有不同。 Pressed 表示鼠标已经在某个 Node 上被按下并且还没有被释放。然而 arm 也会考虑鼠标是否真的在按钮上方并被按下。
处于待命状态的按钮与未处于待命状态的按钮的外观略有不同。大多数程序从不需要与按钮的武装状态进行交互。
选定状态样式的示例
区分选中的切换按钮和未选中的切换按钮的标准方法是将其变暗以赋予其深度样式效果,并使其在被按下时显得更远。这是标准的toggle button css for JavaFX 2.2:
.toggle-button:selected {
-fx-background-color:
-fx-shadow-highlight-color,
linear-gradient(to bottom, derive(-fx-color,-90%) 0%, derive(-fx-color,-60%) 100%),
linear-gradient(to bottom, derive(-fx-color,-60%) 0%, derive(-fx-color,-35%) 50%, derive(-fx-color,-30%) 98%, derive(-fx-color,-50%) 100%),
linear-gradient(to right, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0) 10%, rgba(0,0,0,0) 90%, rgba(0,0,0,0.3) 100%);
-fx-background-insets: 0 0 -1 0, 0, 1, 1;
/* TODO: -fx-text-fill should be derived */
-fx-text-fill: -fx-light-text-color;
}
您可以通过defining your own stylesheet 覆盖此默认行为,它为选定状态提供替代定义。下面的示例将确保所选状态显示比标准更微妙,仅将所选状态颜色变暗一小部分而不是很多。
未选中
已选中
关联的css:
/**
* file: colored-toggle.css
* Place in same directory as ColoredToggle.java.
* Have your build system copy this file to your build output directory.
**/
.root {
-fx-background-color: cornsilk;
-fx-padding: 10;
}
.toggle-button {
-fx-color: paleturquoise;
}
.toggle-button:selected {
-fx-background-color:
-fx-shadow-highlight-color,
linear-gradient(to bottom, derive(-fx-color,-22%) 0%, derive(-fx-color,-15%) 100%),
linear-gradient(to bottom, derive(-fx-color,-15%) 0%, derive(-fx-color,-10%) 50%, derive(-fx-color,-8%) 98%, derive(-fx-color,-12%) 100%);
}
.toggle-button:selected:focused {
-fx-background-color:
-fx-focus-color,
linear-gradient(to bottom, derive(-fx-color,-22%) 0%, derive(-fx-color,-15%) 100%),
linear-gradient(to bottom, derive(-fx-color,-15%) 0%, derive(-fx-color,-10%) 50%, derive(-fx-color,-8%) 98%, derive(-fx-color,-12%) 100%);
}
源文件:
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class ColoredToggle extends Application {
public static void main(String[] args) { Application.launch(ColoredToggle.class, args); }
@Override public void start(Stage stage) {
ToggleButton visibilityControl = new ToggleButton("Winterfell");
VBox layout = new VBox(10);
layout.setAlignment(Pos.CENTER);
layout.getChildren().setAll(visibilityControl);
layout.getStylesheets().add(getClass().getResource("colored-toggle.css").toExternalForm());
stage.setScene(new Scene(layout));
stage.show();
}
}