feat: add info/warn/error methods to LabelTips
This commit is contained in:
313
src/main/java/com/imyeyu/fx/ui/components/LabelTips.java
Normal file
313
src/main/java/com/imyeyu/fx/ui/components/LabelTips.java
Normal file
@ -0,0 +1,313 @@
|
|||||||
|
package com.imyeyu.fx.ui.components;
|
||||||
|
|
||||||
|
import com.imyeyu.fx.ui.TimiFXUI;
|
||||||
|
import com.imyeyu.utils.Time;
|
||||||
|
import javafx.animation.PauseTransition;
|
||||||
|
import javafx.application.Platform;
|
||||||
|
import javafx.beans.property.LongProperty;
|
||||||
|
import javafx.beans.property.SimpleLongProperty;
|
||||||
|
import javafx.scene.control.Label;
|
||||||
|
import javafx.scene.paint.Paint;
|
||||||
|
import javafx.util.Duration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 提示标签,可以临时显示提示内容,经过指定时间后自动恢复原内容。
|
||||||
|
* <p>
|
||||||
|
* 此组件是线程安全的,可以从任意线程调用 {@link #tips(String)} 方法。
|
||||||
|
* 如果在提示期间再次调用 tips 方法,会重置计时器并显示新的提示内容,
|
||||||
|
* 恢复时仍然恢复为最初的原始内容。
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* <pre>{@code
|
||||||
|
* LabelTips label = new LabelTips("默认内容");
|
||||||
|
* label.tips("操作成功!"); // 使用默认 3 秒
|
||||||
|
* label.tips("保存完成!", 5000); // 指定 5 秒
|
||||||
|
* }</pre>
|
||||||
|
*
|
||||||
|
* @author 夜雨
|
||||||
|
* @since 2025-01-14
|
||||||
|
*/
|
||||||
|
public class LabelTips extends Label implements TimiFXUI.Colorful {
|
||||||
|
|
||||||
|
/** 默认提示持续时间(毫秒) */
|
||||||
|
public static final long DEFAULT_DURATION = Time.S * 5;
|
||||||
|
|
||||||
|
/** 信息提示颜色 */
|
||||||
|
public static final Paint INFO_TEXT_FILL = BLUE;
|
||||||
|
|
||||||
|
/** 警告提示颜色 */
|
||||||
|
public static final Paint WARN_TEXT_FILL = ORANGE;
|
||||||
|
|
||||||
|
/** 错误提示颜色 */
|
||||||
|
public static final Paint ERROR_TEXT_FILL = RED;
|
||||||
|
|
||||||
|
/** 提示持续时间(毫秒) */
|
||||||
|
protected LongProperty duration;
|
||||||
|
|
||||||
|
/** 原始内容,提示结束后恢复 */
|
||||||
|
private volatile String originalText;
|
||||||
|
|
||||||
|
/** 原始颜色,提示结束后恢复 */
|
||||||
|
private volatile Paint originalTextFill;
|
||||||
|
|
||||||
|
/** 定时器,用于恢复原内容 */
|
||||||
|
private PauseTransition transition;
|
||||||
|
|
||||||
|
/** 同步锁 */
|
||||||
|
private final Object lock = new Object();
|
||||||
|
|
||||||
|
/** 默认构造器 */
|
||||||
|
public LabelTips() {
|
||||||
|
this("");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 标准构造器
|
||||||
|
*
|
||||||
|
* @param text 标签初始文本
|
||||||
|
*/
|
||||||
|
public LabelTips(String text) {
|
||||||
|
super(text);
|
||||||
|
this.duration = new SimpleLongProperty(DEFAULT_DURATION);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示提示内容,使用默认持续时间
|
||||||
|
*
|
||||||
|
* @param content 提示内容
|
||||||
|
*/
|
||||||
|
public void tips(String content) {
|
||||||
|
tips(content, duration.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示提示内容,指定持续时间
|
||||||
|
*
|
||||||
|
* @param content 提示内容
|
||||||
|
* @param millis 持续时间(毫秒)
|
||||||
|
*/
|
||||||
|
public void tips(String content, long millis) {
|
||||||
|
tips(content, Duration.millis(millis));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示提示内容,指定持续时间
|
||||||
|
*
|
||||||
|
* @param content 提示内容
|
||||||
|
* @param duration 持续时间
|
||||||
|
*/
|
||||||
|
public void tips(String content, Duration duration) {
|
||||||
|
tips(content, duration, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示提示内容,指定持续时间与颜色
|
||||||
|
*
|
||||||
|
* @param content 提示内容
|
||||||
|
* @param duration 持续时间
|
||||||
|
* @param textFill 文本颜色
|
||||||
|
*/
|
||||||
|
public void tips(String content, Duration duration, Paint textFill) {
|
||||||
|
if (Platform.isFxApplicationThread()) {
|
||||||
|
doTips(content, duration, textFill);
|
||||||
|
} else {
|
||||||
|
Platform.runLater(() -> doTips(content, duration, textFill));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示信息提示内容,使用默认持续时间
|
||||||
|
*
|
||||||
|
* @param content 提示内容
|
||||||
|
*/
|
||||||
|
public void info(String content) {
|
||||||
|
info(content, duration.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示信息提示内容,指定持续时间
|
||||||
|
*
|
||||||
|
* @param content 提示内容
|
||||||
|
* @param millis 持续时间(毫秒)
|
||||||
|
*/
|
||||||
|
public void info(String content, long millis) {
|
||||||
|
info(content, Duration.millis(millis));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示信息提示内容,指定持续时间
|
||||||
|
*
|
||||||
|
* @param content 提示内容
|
||||||
|
* @param duration 持续时间
|
||||||
|
*/
|
||||||
|
public void info(String content, Duration duration) {
|
||||||
|
tips(content, duration, INFO_TEXT_FILL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示警告提示内容,使用默认持续时间
|
||||||
|
*
|
||||||
|
* @param content 提示内容
|
||||||
|
*/
|
||||||
|
public void warn(String content) {
|
||||||
|
warn(content, duration.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示警告提示内容,指定持续时间
|
||||||
|
*
|
||||||
|
* @param content 提示内容
|
||||||
|
* @param millis 持续时间(毫秒)
|
||||||
|
*/
|
||||||
|
public void warn(String content, long millis) {
|
||||||
|
warn(content, Duration.millis(millis));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示警告提示内容,指定持续时间
|
||||||
|
*
|
||||||
|
* @param content 提示内容
|
||||||
|
* @param duration 持续时间
|
||||||
|
*/
|
||||||
|
public void warn(String content, Duration duration) {
|
||||||
|
tips(content, duration, WARN_TEXT_FILL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示错误提示内容,使用默认持续时间
|
||||||
|
*
|
||||||
|
* @param content 提示内容
|
||||||
|
*/
|
||||||
|
public void error(String content) {
|
||||||
|
error(content, duration.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示错误提示内容,指定持续时间
|
||||||
|
*
|
||||||
|
* @param content 提示内容
|
||||||
|
* @param millis 持续时间(毫秒)
|
||||||
|
*/
|
||||||
|
public void error(String content, long millis) {
|
||||||
|
error(content, Duration.millis(millis));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示错误提示内容,指定持续时间
|
||||||
|
*
|
||||||
|
* @param content 提示内容
|
||||||
|
* @param duration 持续时间
|
||||||
|
*/
|
||||||
|
public void error(String content, Duration duration) {
|
||||||
|
tips(content, duration, ERROR_TEXT_FILL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行提示逻辑,必须在 FX 线程调用
|
||||||
|
*
|
||||||
|
* @param content 提示内容
|
||||||
|
* @param duration 持续时间
|
||||||
|
*/
|
||||||
|
private void doTips(String content, Duration duration, Paint textFill) {
|
||||||
|
synchronized (lock) {
|
||||||
|
// 停止之前的定时器
|
||||||
|
if (transition != null) {
|
||||||
|
transition.stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 仅在首次调用时保存原始内容
|
||||||
|
if (originalText == null) {
|
||||||
|
originalText = getText();
|
||||||
|
originalTextFill = getTextFill();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置提示内容
|
||||||
|
setText(content);
|
||||||
|
if (textFill != null) {
|
||||||
|
setTextFill(textFill);
|
||||||
|
} else {
|
||||||
|
setTextFill(originalTextFill);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建定时器
|
||||||
|
transition = new PauseTransition(duration);
|
||||||
|
transition.setOnFinished(e -> {
|
||||||
|
synchronized (lock) {
|
||||||
|
setText(originalText);
|
||||||
|
setTextFill(originalTextFill);
|
||||||
|
originalText = null;
|
||||||
|
originalTextFill = null;
|
||||||
|
transition = null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
transition.play();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 立即恢复原始内容,取消正在进行的提示
|
||||||
|
*/
|
||||||
|
public void restore() {
|
||||||
|
if (Platform.isFxApplicationThread()) {
|
||||||
|
doRestore();
|
||||||
|
} else {
|
||||||
|
Platform.runLater(this::doRestore);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 执行恢复逻辑,必须在 FX 线程调用
|
||||||
|
*/
|
||||||
|
private void doRestore() {
|
||||||
|
synchronized (lock) {
|
||||||
|
if (transition != null) {
|
||||||
|
transition.stop();
|
||||||
|
transition = null;
|
||||||
|
}
|
||||||
|
if (originalText != null) {
|
||||||
|
setText(originalText);
|
||||||
|
setTextFill(originalTextFill);
|
||||||
|
originalText = null;
|
||||||
|
originalTextFill = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查当前是否正在显示提示
|
||||||
|
*
|
||||||
|
* @return 如果正在显示提示返回 true
|
||||||
|
*/
|
||||||
|
public boolean isTipping() {
|
||||||
|
synchronized (lock) {
|
||||||
|
return originalText != null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取默认提示持续时间
|
||||||
|
*
|
||||||
|
* @return 持续时间(毫秒),默认 {@value #DEFAULT_DURATION}
|
||||||
|
*/
|
||||||
|
public long getDuration() {
|
||||||
|
return duration.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置默认提示持续时间
|
||||||
|
*
|
||||||
|
* @param millis 持续时间(毫秒)
|
||||||
|
*/
|
||||||
|
public void setDuration(long millis) {
|
||||||
|
this.duration.set(millis);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取持续时间属性
|
||||||
|
*
|
||||||
|
* @return 持续时间属性
|
||||||
|
*/
|
||||||
|
public LongProperty durationProperty() {
|
||||||
|
return duration;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user