Initial project

This commit is contained in:
Timi
2025-07-14 15:08:16 +08:00
parent c26de45a80
commit 40f556d0e1
133 changed files with 15044 additions and 95 deletions

View File

@@ -0,0 +1,134 @@
package com.imyeyu.fx.ui.components;
import com.imyeyu.fx.TimiFX;
import com.imyeyu.fx.ui.TimiFXUI;
import com.sun.javafx.scene.control.LabeledText;
import javafx.beans.binding.Bindings;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.ListChangeListener;
import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.scene.control.Skin;
import javafx.scene.control.skin.LabelSkin;
import javafx.scene.paint.Paint;
import javafx.scene.shape.Rectangle;
/**
* 标题标签,此组件左侧显示标题,并添加中线分割,产生内容分割并充当标题。组件默认最大化宽度
*
* @author 夜雨
* @since 2022-09-06 15:03
*/
public class TitleLabel extends Label implements TimiFXUI {
/** 标题与分割线间距 */
protected DoubleProperty spacing;
/** 分割线颜色 */
protected ObjectProperty<Paint> lineColor;
/** 默认构造器 */
public TitleLabel() {
this("");
}
/**
* 标准构造器
*
* @param text 标题文本
*/
public TitleLabel(String text) {
super(text);
lineColor = new SimpleObjectProperty<>(Colorful.BORDER);
spacing = new SimpleDoubleProperty(6);
setMaxWidth(Double.MAX_VALUE);
}
@Override
protected Skin<?> createDefaultSkin() {
Skin<?> defaultSkin = super.createDefaultSkin();
if (defaultSkin instanceof LabelSkin skin) {
Rectangle line = new Rectangle();
line.setHeight(1);
line.fillProperty().bind(lineColor);
line.translateYProperty().bind(heightProperty().multiply(.5).subtract(1));
Node node = skin.getChildren().get(0);
if (node instanceof LabeledText text) {
line.widthProperty().bind(Bindings.createDoubleBinding(() -> {
double textWidth = text.getLayoutBounds().getWidth();
return getWidth() - textWidth - spacing.get();
}, spacing, widthProperty(), text.layoutBoundsProperty()));
line.translateXProperty().bind(Bindings.createDoubleBinding(() -> {
double textWidth = text.getLayoutBounds().getWidth();
return textWidth + spacing.get();
}, spacing, text.layoutBoundsProperty()));
}
skin.getChildren().addListener((ListChangeListener<Node>) c -> {
if (skin.getChildren().get(0) != line) {
skin.getChildren().add(0, line);
}
});
skin.getChildren().add(0, line);
}
return defaultSkin;
}
/**
* 获取当前分割线颜色
*
* @return 分割线颜色,默认 {@link TimiFX.Colorful#BORDER}
*/
public Paint getLineColor() {
return lineColor.get();
}
/**
* 设置分割线颜色
*
* @param lineColor 分割线颜色
*/
public void setLineColor(Paint lineColor) {
this.lineColor.set(lineColor);
}
/**
* 获取分割线颜色监听
*
* @return 分割线颜色监听
*/
public ObjectProperty<Paint> lineColorProperty() {
return lineColor;
}
/**
* 获取当前标题文本和分割线的间距
*
* @return 标题文本和分割线的间距,默认 6
*/
public double getSpacing() {
return spacing.get();
}
/**
* 设置标题文本和分割线的间距
*
* @param spacing 标题文本和分割线的间距
*/
public void setSpacing(double spacing) {
this.spacing.set(spacing);
}
/**
* 获取当前标题文本和分割线的间距监听
*
* @return 标题文本和分割线的间距监听
*/
public DoubleProperty spacingProperty() {
return spacing;
}
}