JavaFX中控件的延伸设置

背身沙鹰瞄边选手 2023-10-17 23:02:52

HBox是JavaFX中的水平布局管理器,其中的public static void setHgrow(Node child, Priority value)方法可以设置HBox中控件的水平延伸侧率:

public static void setHgrow(Node child, Priority value)

Sets the horizontal grow priority for the child when contained by an hbox. If set, the
hbox will use the priority value to allocate additional space if the hbox is resized
larger than its preferred width. If multiple hbox children have the same horizontal grow
priority, then the extra space will be split evenly between them. If no horizontal grow
priority is set on a child, the hbox will never allocate any additional horizontal space
for that child. 

为什么TextField设置有用,但是Button设置没有用,示例如下:

package javafx8.ch10;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.stage.Stage;

/**
 * @copyright 2023-2022
 * @package   javafx8.ch10
 * @file      HBoxHGrow.java
 * @date      2023-08-20 10:39
 * @author    qiao wei
 * @version   1.0
 * @brief     对容器中单个控件进行水平方向伸缩设置。
 * @history
 */
public class HBoxHGrow extends Application {
    
    public HBoxHGrow() {}

    @Override
    public void start(Stage stage) throws Exception {
        Label nameLabel = new Label("Name:");
        TextField nameField = new TextField();
        Button okButton = new Button("OK");
        Button cancelButton = new Button("Cancel");        
        
        HBox root = new HBox(10);
        root.getChildren().addAll(nameLabel, nameField, okButton, cancelButton);
        // Let the TextField and Button always grow horizontally
        HBox.setHgrow(nameField, Priority.ALWAYS);
        HBox.setHgrow(okButton, Priority.ALWAYS);
        

        Insets margin = new Insets(10, 3, 10, 2);
        HBox.setMargin(nameLabel, margin);
        HBox.setMargin(nameField, margin);
        HBox.setMargin(okButton, margin);
        HBox.setMargin(cancelButton, margin);

        root.setStyle("-fx-padding: 10;" +
            "-fx-border-style: solid inside;" +
            "-fx-border-width: 2;" +
            "-fx-border-insets: 5;" +
            "-fx-border-radius: 5;" +
            "-fx-border-color: blue;");
        
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.setTitle("Using Horizontal Grow Priority in an HBox");
        stage.show();
    }

    public static void main(String[] args) {
        try {
            Application.launch(HBoxHGrow.class, args);
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}

 结果如下,水平方向只有文本框水平延伸:

 

 

 

 

 

...全文
352 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
T0BSky 2024-05-22
  • 打赏
  • 举报
回复

在JavaFX中,HBox.setHgrow(Node child, Priority value) 方法用于设置子节点在HBox中的水平扩展优先级。这意味着,当HBox的宽度大于其首选宽度时,具有水平扩展优先级的子节点将会被分配额外的空间。如果多个子节点具有相同的水平扩展优先级,则额外的空间将均匀分配给它们。如果没有为子节点设置水平扩展优先级,则HBox不会为该子节点分配任何额外的水平空间。

在您的示例中,TextField设置了水平扩展优先级为Priority.ALWAYS,因此它会尽可能地水平扩展。而Button默认情况下没有设置水平扩展优先级,所以它不会水平扩展。

如果您希望Button也能够水平扩展,可以为它设置水平扩展优先级,例如:

HBox.setHgrow(okButton, Priority.ALWAYS);
HBox.setHgrow(cancelButton, Priority.ALWAYS);

这样,okButtoncancelButton也会在HBox水平方向上扩展。

  • 举报
回复
@T0BSky 非常感谢。
杨利杰YJlio 2023-10-28
  • 打赏
  • 举报
回复

在JavaFX中,你可以使用控件的属性和事件来实现各种延伸设置,以增加控件的交互性和功能性。以下是一些常见的控件延伸设置的示例:

  1. 添加事件处理器
    你可以为控件添加事件处理器,以响应用户的交互操作。例如,你可以为按钮添加点击事件处理器,为文本框添加文本变化事件处理器,为滑块添加滑动事件处理器等。这使你能够在用户与控件交互时执行自定义代码。

    Button button = new Button("点击我");
    button.setOnAction(event -> {
        // 在按钮点击时执行的代码
        System.out.println("按钮被点击了");
    });
    
  2. 设置样式和CSS
    你可以使用CSS来美化和自定义控件的外观。JavaFX支持CSS样式表,你可以为控件指定样式类并定义CSS规则来自定义控件的外观。

    button.getStyleClass().add("custom-button"); // 添加自定义样式类
    
  3. 布局管理
    使用不同的布局管理器来控制控件的位置和大小。例如,你可以使用VBoxHBoxGridPane等来组织控件的布局。

    VBox vbox = new VBox();
    vbox.getChildren().addAll(button1, button2, button3);
    
  4. 绑定属性
    你可以使用属性绑定来将一个属性的值与另一个属性的值关联。这样,一个属性的更改将自动影响到另一个属性。

    DoubleProperty widthProperty = new SimpleDoubleProperty(100.0);
    rectangle.widthProperty().bind(widthProperty);
    
  5. 自定义控件
    你可以创建自定义控件,这样你可以将多个控件封装到一个自定义控件中,以提供更复杂的功能。自定义控件允许你在应用程序中重用自己的UI元素。

  6. 动画效果
    你可以使用JavaFX的动画类来为控件添加动画效果。例如,你可以使用TranslateTransitionFadeTransition等来创建平移、渐变等动画效果。

    TranslateTransition translate = new TranslateTransition(Duration.seconds(1), button);
    translate.setByX(100); // 沿X轴平移100像素
    translate.play();
    
  7. 弹出菜单和对话框
    你可以创建弹出菜单或对话框,以响应用户的操作。这可以通过JavaFX的弹出窗口和对话框类来实现。

    ContextMenu contextMenu = new ContextMenu();
    MenuItem item1 = new MenuItem("选项1");
    MenuItem item2 = new MenuItem("选项2");
    contextMenu.getItems().addAll(item1, item2);
    button.setContextMenu(contextMenu);
    

这些是一些常见的方式来扩展和增强JavaFX控件的功能。根据你的需求和项目,你可以选择适当的延伸设置来实现所需的功能和交互性。

  • 举报
回复
@杨利杰YJlio 非常感谢。
  • 打赏
  • 举报
回复

已解决。需要提前设置okButton.setMaxWidth()方法,默认情况下maxWidth是-1.0,控件水平方向延伸不受容器设置。

51,408

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧