Button常用相关属性

pickOnBoundsProperty (pick On Bounds)

表示组件的鼠标事件在边界范围处理方式,如果 pickOnBounds为true,则通过与该节点的边界相交来计算拾取,否则通过与该节点的几何形状相交来计算拾取。官网原文解释:

Defines how the picking computation is done for this node when triggered by a MouseEvent or a contains function call. If pickOnBounds is true, then picking is computed by intersecting with the bounds of this node, else picking is computed by intersecting with the geometric shape of this node.

​​​​说简单点就是,该属性为true时,假如该组件(按钮)是圆形的,此时鼠标的事件相应范围是能框住这个组件的矩形;当该属性为false时,此时鼠标的事件相应范围是该组件本身的形状,也就是这个圆形。下边会举一个比较清晰直观的例子。

mouseTransparentProperty (Mouse Transparent)

表示如果 mouseTransparent 为true,此节点(及其所有子节点)对鼠标事件完全透明。选择鼠标事件的目标时,不会考虑mouseTransparent设置为true及其子树的节点。官网原文解释:

If true, this node (together with all its children) is completely transparent to mouse events. When choosing target for mouse event, nodes with mouseTransparent set to true and their subtrees won't be taken into account.

下边的这个例子将清晰直观地演示这个两个属性(注:该例代码修改自LayerClick.java
        先看下效果:

演示pickOnBounds和mouseTransparent属性

解释:完全可点击、部分可点击、不可点击、指的是ToggleButton的点击状态。当两个属性都没选时,button只有一部分能按动,因为使用的stackpane存放的button和circle,circle在上面(circle的透明度为0.7),盖住了button的一部分。当pickOnBounds为true时,此时circle鼠标事件响应的边界,变成一个矩形(刚好框住圆形), 而button在矩形范围内,所以此时button完全被circle盖住了,不能点击。当mouseTransparentProperty为true时,此时circle对鼠标透明,所以此时button完全都能点击。

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ToggleButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;// 演示JavaFX节点mouseTransparent和pickOnBounds属性
public class CustomControl extends Application {public static void main(String[] args) {launch(args);}@Overridepublic void start(Stage stage) throws Exception {ToggleButton testButton = new ToggleButton("");VBox layer1 = new VBox();layer1.getChildren().add(testButton);Node layer2 = new Circle(100, 100, 100, Color.FIREBRICK);layer2.setOnMouseClicked(new EventHandler<MouseEvent>() {@Overridepublic void handle(MouseEvent event) {System.out.println("circle click");}});layer2.setOpacity(0.7);StackPane stack = new StackPane();stack.getChildren().setAll(layer1, layer2);stack.setStyle("-fx-background-color: azure;");VBox layout = new VBox();layout.getChildren().setAll(stack, createControls(testButton, layer2));stage.setScene(new Scene(layout));stage.show();}private VBox createControls(ToggleButton controlledButton, Node controlledNode) {controlledButton.textProperty().bind(Bindings.when(controlledNode.mouseTransparentProperty()).then("完全可点击").otherwise(Bindings.when(controlledNode.pickOnBoundsProperty()).then("不可点击").otherwise("部分可点击"))); // button的text值绑定圆的mouseTransparentProperty和pickOnBoundsPropertyCheckBox enableMouseTransparency = new CheckBox("激活MouseTransparency");enableMouseTransparency.setSelected(controlledNode.isMouseTransparent());controlledNode.mouseTransparentProperty().bind(enableMouseTransparency.selectedProperty());// 圆的mouseTransparentProperty绑定checkbox的选中属性。// mouseTransparentProperty若为true则该节点及其子节点的鼠标事件无效CheckBox enablePickOnBounds = new CheckBox("激活Pick On Bounds");enablePickOnBounds.setSelected(controlledNode.isPickOnBounds());controlledNode.pickOnBoundsProperty().bind(enablePickOnBounds.selectedProperty());// 圆的pickOnBoundsProperty绑定checkbox的选中属性VBox controls = new VBox(10);controls.setStyle("-fx-background-color: cornsilk; -fx-padding: 10;");controls.getChildren().addAll(enableMouseTransparency, enablePickOnBounds);return controls;}
}

制作多边形按钮Button

方法有两种

  1. 将 Button 的背景颜色设置为透明,同时用一张多边形 PNG 格式的图片当作 Button 的背景。这种方法相对简单,但比较粗糙,因为它的边角还是存在的,只不过变成透明的了。
    这里稍微点几个关键的属性就好,实现不难。

    <!--去掉按钮(Button)的边框-->
    -fx-background-insets: 0.0;<!--按钮背景设置为透明-->
    -fx-background-color: transparent;<!--图片的相关属性-->
    -fx-background-repeat: no-repeat;
    -fx-background-position: center;
    -fx-background-image: url(yourpath/*.png);
  2. 第二种方法,用Polygon制做出多边形polygon后,用 button.setShape(polygon) 设置按钮的形状,还可以根据需要用button.setRotate(degree) 将按钮旋转。绘制多边形算法可以参考下面这篇文章:如何画一个正多边形,下面以制作六边形按钮为例。

制作六边形按钮

先上个效果图:

Demo.fxml

<?xml version="1.0" encoding="UTF-8"?><?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?><AnchorPane prefHeight="200.0" prefWidth="300.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="customcontrolexample.DemoControl"><children><Button fx:id="button1" layoutX="50.0" layoutY="55.0" mnemonicParsing="false" prefHeight="100.0" prefWidth="100.0" text="Button1" /><Button fx:id="button2" layoutX="150.0" layoutY="55.0" mnemonicParsing="false" prefHeight="100.0" prefWidth="100.0" text="Button2" /></children>
</AnchorPane>

DemoControl.java

import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.shape.Polygon;public class DemoControl {@FXMLprivate Button button1;@FXMLprivate Button button2;@FXMLprivate void initialize() {//正六边形double[] path = new double[12];for (int q = 0; q < 6; q++) {double x = Math.cos(Math.PI / 3.0 * q);double y = Math.sin(Math.PI / 3.0 * q);//也可以在此处设置组件旋转的角度,如旋转90°,//double x = Math.cos(Math.PI / 3.0 * q + Math.PI / 2.0);//double y = Math.sin(Math.PI / 3.0 * q + Math.PI / 2.0);path[q * 2] = x;path[q * 2 + 1] = y;}Polygon hexagon = new Polygon(path);button1.setShape(hexagon);button2.setShape(hexagon);button1.setRotate(90);//button1旋转90°}
}

Demo.java

import java.io.IOException;import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;public class Demo extends Application {private AnchorPane rootLayout;@Overridepublic void start(Stage primaryStage) {FXMLLoader loader = new FXMLLoader();loader.setLocation(Demo.class.getResource("Demo.fxml"));try {rootLayout = (AnchorPane) loader.load();DemoControl control = loader.getController();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}Scene scene = new Scene(rootLayout);primaryStage.setScene(scene);primaryStage.show();}public static void main(String[] args) {launch(args);}
}

对Button进一步美化

可以对按钮不同的状态设置不同的背景图片(可以参考这个思路:我一般都是这样做的,比较有点击感。原来的按钮:图片1,悬停状态: 图片2,按住状态: 图片1。先上一个效果图(这部分比较容易实现,我就不放代码了,点出要用到的属性就好,下图是我课设的一部分,后面整理好后,在放完整的图片)。
       效果图:

<!--原来状态-->
#yourButton {-fx-background-image: url(path/*.png);
}
<!--悬停状态-->
#yourButton:hover{-fx-background-image: url(path/*.png);
}
<!--按压状态-->
#yourButton:pressed {-fx-background-image: url(path/*.png);
}

在Java代码中更改Button背景图片

如果需要在Java代码中更改Button背景图片,可按以下方式更改

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;public class Main extends Application {@Overridepublic void start(Stage primaryStage) {try {Pane root = new Pane();Button button = new Button();//资源文件的类加载器的绝对路径String path = getClass().getClassLoader().getResource("application/resources/image/timg.jpg").toExternalForm();Image image = new Image(path);ImageView imageView = new ImageView(image);//更改按钮图像button.setGraphic(imageView);root.getChildren().add(button);Scene scene = new Scene(root);primaryStage.setScene(scene);primaryStage.show();} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {launch(args);}
}

项目结构:

效果图:

上面这个方式可能会出现图像在组件中无法居中的问题,所以建议用CSS进行修改。

String path = getClass().getClassLoader().getResource("类加载资源的绝对路径").toExternalForm();
button.setStyle("-fx-background-image: url('"+path+"')");

这里顺便提一下,因为Jar文件系统不支持相对路径,如果要将项目打包成 Jar文件或 exe文件,加载引用资源最好使用

/**类加载器的绝对路径,toExternalForm()方法将URL用字符串表示出来*/
getClass().getClassloader().getResource(path).toExternalForm()

同时注意将资源文件放在src包下,以免资源文件加载不出来。

JavaFX Button常用相关属性和制作多边形按钮Button相关推荐

  1. 按钮button的常用属性和事件

    文章目录 1 按钮button的常用属性和事件 1 按钮button的常用属性 1 按钮button的常用属性和事件 1 按钮button的常用属性 Tag: 我们可以通过tag对按钮增加数据. pr ...

  2. PyQt(Python+Qt)入门:Designer组件属性编辑界面中QWidget类相关属性详解

    本文适用人员:本文比较长,适合不理解Qt Designer部件属性的人员阅读或资料查找. 声明: 1.如果有人认为本文是简单的复制粘贴+翻译而成,敬请读本文最后的后记: 2.本文为老猿Python学习 ...

  3. php中的文字排版问题,CSS布局中常用的文字排版相关属性详解

    本篇文章给大家带来的内容是关于CSS布局中常用的文字排版相关属性详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. CSS布局中常用的文字排版相关属性详解 一.设定文字字体.颜色.大 ...

  4. Python中Button按钮组件常用的属性及参数设置

    Python中Button按钮组件常用的属性及参数设置 本篇文章中小编给大家介绍Button按钮组件的相关常用的属性以及参数的设置. 一. 常用属性使用语法 变量=Button(父容器(根窗口),参数 ...

  5. 林期苏曼属性标签编辑_解析制作条形码的相关属性

    标签打印软件是一款专业的条码标签设计软件,对于刚接触标签设计软件的新用户来说,在软件中制作条形码还能还是比较生疏.主要还是源于对条码软件的不了解.例如,想要修改条形码的尺寸.类型.数据字体大小等,都不 ...

  6. css:input button常用属性以及将button嵌入到input中

    1.鼠标经过button变成小手 //css属性 cursor:pointer; 2.清除button默认边框 border: none; 3.清除input默认边框 outline: 0; 4.设置 ...

  7. CSS3新增的相关属性

    文章目录 前言 CSS3属性 一,实现深色模式和浅色模式的切换 1.1,"checked"作用 1.2,语法 1.3,例 二,盒子模型(背景) 2.1,释义 2.2 , " ...

  8. CSS冷门属性 mix-blend-mode 制作文字镂空效果

    CSS冷门属性 mix-blend-mode 制作文字镂空效果 本篇文章为大家带来如何制作文字镂空效果,仅仅使用CSS样式进行处理,借助 mix-blend-mode 属性,将文字的颜色反转,从而实现 ...

  9. python按钮调用函数_Python中Button组件的属性及参数

    Python中Button按钮组件常用的属性及参数设置 温馨提示,文章篇幅较长,请耐心阅本篇文章中小编给大家介绍Button按钮组件的相关常用的属性以及参数的设置. 一. 常用属性使用语法 变量=Bu ...

最新文章

  1. python语音播报-使用pyttsx3实现python语音播报
  2. python处理utf8编码中文,及打印中文列表和字典
  3. python inspect模块
  4. 三、Netty的粘包半包问题解决
  5. url能访问但new file()找不到文件_Go Web编程给自己写的服务器添加错误和访问日志...
  6. python下sqlite增删查改方法(转)
  7. Pycharm 安装 tensorflow 的一些坑
  8. Mybatis的直接执行SQL
  9. 九、K8s deployment相关操作
  10. [2019杭电多校第三场][hdu6609]Find the answer(线段树)
  11. stm32程序跑飞_mm32芯片使用心得(三)音频播放程序修改
  12. asp.net网上零食销售商城系统
  13. 变速恒频风电机组的优缺点_恒速和变速恒频风电系统简介
  14. 动作频频,BAT欲瓜分10万亿互联网医疗市场蛋糕?
  15. 干货分享|如何使用小鸟云服务器搭建Wordpress站点
  16. 前端高效开发必备的js库梳理,日常使用中会持续更新
  17. 为什么英语会有主格和宾格之分?比如:I、me
  18. 加速PG中vacuum
  19. 汉诺塔(hanoi)
  20. veket linux安装到硬盘,安装veket到移动硬盘NTFS分区

热门文章

  1. 操作系统~用户态进入内核态的方式(中断、异常、系统调用)
  2. python项目之欢天喜地接元宝
  3. Jmeter超高并发解决方案
  4. 正则表达式中的常用模式字符串及两种匹配模式
  5. 那些跟马化腾一起创业的亿万富翁们
  6. 使用 React 为 Chimee 开发插件
  7. 192.168.0.1手机登陆wifi设置怎么做
  8. 直播预告 | NeurIPS 2022预讲会-中国人民大学PhD专场
  9. 九月英语总结——兴趣是最好的老师
  10. 大学一年半的总结,思考与其他