feat:1.调整了显示界面的UI 2.去掉了反馈区域的同步

This commit is contained in:
叁玖领域 2025-09-28 20:59:05 +08:00
parent 4625d30105
commit b7030ede3c
20 changed files with 956 additions and 80 deletions

View File

@ -1,3 +1,3 @@
project_group =top.r3944realms.docchecktoolrefacored
project_name = doc-check-tool
project_version = 1.0
project_version = 1.0.0.3

View File

@ -12,7 +12,7 @@ public class JavaFxApplication extends Application {
@Override
public void init() throws Exception {
super.init();
System.setVersion("1.0.0-beta");
System.setVersion("1.0.0.3-beta");
}
@Override

View File

@ -201,9 +201,10 @@ public class DuplicateFinder {
hashCalculator.calculateHash(file.getPath());
file.setHash(hash);
synchronized (hashGroups) {
//hashGroups已经定义为ConcurrentHashMap可以利用它本身的线程安全方法来减少同步块
//synchronized (hashGroups) {
hashGroups.computeIfAbsent(hash, k -> new ArrayList<>()).add(file);
}
//}
int current = processedFiles.incrementAndGet();
if (enableProgress && (current % PROGRESS_REPORT_INTERVAL == 0 || current == totalFilesToProcess)) {

View File

@ -1,5 +1,6 @@
package top.r3944realms.docchecktoolrefactored.ui.module;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
@ -17,7 +18,6 @@ import top.r3944realms.docchecktoolrefactored.ui.utils.ProgressBar;
import top.r3944realms.docchecktoolrefactored.util.LoggerMarker;
import java.io.File;
/**
* The type Duplicate document pane controller.
*/
@ -31,6 +31,7 @@ public class DuplicateDocumentPaneController {
@FXML private Button cancel1B;
private final ProgressBar progressBar = new ProgressBar();
private DuplicateDocumentDetectionTask currentTask; // 保存任务引用
/**
* On select folder.
*
@ -54,6 +55,7 @@ public class DuplicateDocumentPaneController {
@FXML void onStart(ActionEvent actionEvent) {
// 禁用开始按钮避免重复点击
start1B.setDisable(true);
removeResultStyle();
log.info(LoggerMarker.DEBUG_MARKER, "用户点击了开始查重按钮");
String folderPath = loadFolder1TF.getText();
if (folderPath == null || folderPath.trim().isEmpty()) {
@ -63,6 +65,10 @@ public class DuplicateDocumentPaneController {
start1B.setDisable(false);
return;
}
// 调用提取的样式方法移除结果文本域错误态
removeResultStyle();
// 调用提取的样式方法添加开始按钮加载态
addStartButtonLoadingStyle();
cancel1B.setDisable(false);
// 显示进度条窗口
progressBar.showProgress(SceneManager.getPrimaryStage(), "重复文件检测", "正在初始化扫描...");
@ -82,10 +88,10 @@ public class DuplicateDocumentPaneController {
task.progressProperty().addListener(progressChangeListener);
// 绑定任务的消息到结果文本区域
ChangeListener<String> messageChangeListener = (observable, oldValue, newValue) -> {
result1TA.setText(newValue);
};
task.messageProperty().addListener(messageChangeListener);
// ChangeListener<String> messageChangeListener = (observable, oldValue, newValue) -> {
// result1TA.setText(newValue);
// };
// task.messageProperty().addListener(messageChangeListener);
// 绑定取消按钮 -> task.cancel()
progressBar.setOnCancel(() -> {
@ -101,6 +107,9 @@ public class DuplicateDocumentPaneController {
result1TA.setText(task.getValue());
start1B.setDisable(false);
cancel1B.setDisable(true);
// 调用提取的样式方法移除开始按钮加载态
removeStartButtonLoadingStyle();
addResultSuccessfulStyle();
log.info(LoggerMarker.RELEASE_MARKER, "查重任务完成,结果如下:{}", task.getValue());
});
@ -109,10 +118,14 @@ public class DuplicateDocumentPaneController {
progressBar.closeProgress();
Throwable exception = task.getException();
currentTask.progressProperty().removeListener(progressChangeListener);
currentTask.messageProperty().removeListener(messageChangeListener);
// currentTask.messageProperty().removeListener(messageChangeListener);
result1TA.setText("检测过程中发生错误: " + exception.getMessage());
// 调用提取的样式方法添加结果文本域错误态
addResultErrorStyle();
DialogUtil.showDetailedErrorDialog("错误", "检测过程中发生错误", exception.getMessage());
start1B.setDisable(false);
// 调用提取的样式方法移除开始按钮加载态
removeStartButtonLoadingStyle();
cancel1B.setDisable(true);
log.error(LoggerMarker.RELEASE_MARKER, "查重任务失败", exception);
});
@ -121,9 +134,11 @@ public class DuplicateDocumentPaneController {
task.setOnCancelled(e -> {
progressBar.closeProgress();
currentTask.progressProperty().removeListener(progressChangeListener);
currentTask.messageProperty().removeListener(messageChangeListener);
// currentTask.messageProperty().removeListener(messageChangeListener);
result1TA.appendText("\n检测已取消");
start1B.setDisable(false);
// 调用提取的样式方法移除开始按钮加载态
removeStartButtonLoadingStyle();
cancel1B.setDisable(true);
log.info(LoggerMarker.RELEASE_MARKER, "查重任务已被取消");
});
@ -140,4 +155,51 @@ public class DuplicateDocumentPaneController {
log.warn(LoggerMarker.DEBUG_MARKER, "没有正在运行的任务可取消");
}
}
}
// ======================== 提取的样式变更方法 ========================
/**
* 为结果文本域添加错误态样式
*/
private void addResultErrorStyle() {
Platform.runLater(() -> {
result1TA.getStyleClass().add("result-error");
});
}
/**
* 为结果文本域添加成功态样式
*/
private void addResultSuccessfulStyle() {
Platform.runLater(() -> {
result1TA.getStyleClass().add("result-error");
});
}
/**
* 为结果文本域移除样式
*/
private void removeResultStyle() {
Platform.runLater(() -> {
result1TA.getStyleClass().remove("result-error");
result1TA.getStyleClass().remove("result-success");
});
}
/**
* 为开始按钮添加加载态样式
*/
private void addStartButtonLoadingStyle() {
Platform.runLater(() -> {
start1B.getStyleClass().add("loading");
});
}
/**
* 为开始按钮移除加载态样式
*/
private void removeStartButtonLoadingStyle() {
Platform.runLater(() -> {
start1B.getStyleClass().remove("loading");
});
}
// ====================================================================
}

View File

@ -1,5 +1,6 @@
package top.r3944realms.docchecktoolrefactored.ui.module;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
@ -119,6 +120,7 @@ public class PathCheckPaneController implements Initializable {
*/
@FXML void onGenerateLA(ActionEvent actionEvent) {
generateLogicalAddress2B.setDisable(true);
removeResultStyle();
log.info(LoggerMarker.DEBUG_MARKER, "用户点击了生成逻辑地址文件按钮");
String filePath = loadCatalog2TF.getText();
if (filePath.isEmpty()) {
@ -179,6 +181,7 @@ public class PathCheckPaneController implements Initializable {
progressBar.closeProgress();
result2TA.setText(task.getValue());
generateLogicalAddress2B.setDisable(false);
addResultSuccessfulStyle();
log.info(LoggerMarker.RELEASE_MARKER, "生成逻辑路径 csv 文件任务完成输出csv文件路径{}", task.getValue());
});
@ -189,6 +192,7 @@ public class PathCheckPaneController implements Initializable {
currentTask.progressProperty().removeListener(progressChangeListener);
currentTask.messageProperty().removeListener(messageChangeListener);
result2TA.setText("检测过程中发生错误: " + exception.getMessage());
addResultErrorStyle();
DialogUtil.showDetailedErrorDialog("错误", "检测过程中发生错误: ", exception.getMessage());
generateLogicalAddress2B.setDisable(false);
log.error(LoggerMarker.RELEASE_MARKER, "生成逻辑路径 csv 文件任务失败", exception);
@ -200,6 +204,7 @@ public class PathCheckPaneController implements Initializable {
currentTask.progressProperty().removeListener(progressChangeListener);
currentTask.messageProperty().removeListener(messageChangeListener);
result2TA.appendText("\n检测已取消");
removeResultStyle();
generateLogicalAddress2B.setDisable(false);
log.info(LoggerMarker.RELEASE_MARKER, "生成逻辑路径 csv 文件任务已被取消");
});
@ -215,6 +220,7 @@ public class PathCheckPaneController implements Initializable {
*/
@FXML void onGeneratePA(ActionEvent actionEvent) {
generatePhysicalAddress2B.setDisable(true);
removeResultStyle();
String folderPath = loadJPGFolder2TF.getText();
if (folderPath.isEmpty()) {
result2TA.setText("请先选择文件夹。");
@ -283,6 +289,7 @@ public class PathCheckPaneController implements Initializable {
result2TA.setText(task.getValue());
generatePhysicalAddress2B.setDisable(false);
log.info(LoggerMarker.RELEASE_MARKER, "生成物理路径 csv 文件任务完成输出csv文件路径{}", task.getValue());
addResultSuccessfulStyle();
});
// 处理任务失败情况
@ -292,6 +299,7 @@ public class PathCheckPaneController implements Initializable {
currentTask.progressProperty().removeListener(progressChangeListener);
currentTask.messageProperty().removeListener(messageChangeListener);
result2TA.setText("检测过程中发生错误: " + exception.getMessage());
addResultErrorStyle();
DialogUtil.showDetailedErrorDialog("错误", "检测过程中发生错误: ", exception.getMessage());
generatePhysicalAddress2B.setDisable(false);
log.error(LoggerMarker.RELEASE_MARKER, "生成物理路径 csv 文件任务失败", exception);
@ -303,6 +311,7 @@ public class PathCheckPaneController implements Initializable {
currentTask.progressProperty().removeListener(progressChangeListener);
currentTask.messageProperty().removeListener(messageChangeListener);
result2TA.appendText("\n检测已取消");
removeResultStyle();
generatePhysicalAddress2B.setDisable(false);
log.info(LoggerMarker.RELEASE_MARKER, "生成物理路径 csv 文件任务已被取消");
});
@ -328,7 +337,8 @@ public class PathCheckPaneController implements Initializable {
return;
}
start2B.setDisable(true);
removeStartButtonLoadingStyle();
start2B.setText("比对中...");
// 显示进度条窗口
cancelableProgressBar.showProgress(SceneManager.getPrimaryStage(), "文件查漏检查", "正在初始化...");
// 创建后台任务
@ -346,10 +356,10 @@ public class PathCheckPaneController implements Initializable {
task.progressProperty().addListener(progressChangeListener);
// 绑定任务的消息到结果文本区域
ChangeListener<String> messageChangeListener = (observable, oldValue, newValue) -> {
result2TA.setText(newValue);
};
task.messageProperty().addListener(messageChangeListener);
// ChangeListener<String> messageChangeListener = (observable, oldValue, newValue) -> {
// result2TA.setText(newValue);
// };
// task.messageProperty().addListener(messageChangeListener);
// 绑定取消按钮 -> task.cancel()
cancelableProgressBar.setOnCancel(() -> {
@ -361,6 +371,8 @@ public class PathCheckPaneController implements Initializable {
task.setOnSucceeded(event -> {
cancelableProgressBar.closeProgress();
start2B.setDisable(false);
addStartButtonLoadingStyle();
start2B.setText("开始对比");
result2TA.setText(AddressFileComparator.ComparisonResult.generateComparisonResults(task.getValue(), loadFolderType2CB.getValue().compareMode));
result2TA.setText(AddressFileComparator.ComparisonResult.generateComparisonResults(task.getValue(), loadFolderType2CB.getValue().compareMode));
//内部比较器已有此处忽略日志打印
@ -371,6 +383,8 @@ public class PathCheckPaneController implements Initializable {
Throwable exception = task.getException();
result2TA.setText("文件比对失败: " + exception.getMessage());
start2B.setDisable(false);
removeStartButtonLoadingStyle();
start2B.setText("开始对比");
DialogUtil.showDetailedErrorDialog("错误", "文件比对失败:", exception.getMessage());
log.error(LoggerMarker.RELEASE_MARKER, "查漏任务失败", exception);
});
@ -379,8 +393,10 @@ public class PathCheckPaneController implements Initializable {
cancelableProgressBar.closeProgress();
result2TA.appendText("\n检测已取消");
start2B.setDisable(false);
removeStartButtonLoadingStyle();
start2B.setText("开始对比");
currentTask.progressProperty().removeListener(progressChangeListener);
currentTask.messageProperty().removeListener(messageChangeListener);
// currentTask.messageProperty().removeListener(messageChangeListener);
log.info(LoggerMarker.RELEASE_MARKER, "查漏任务取消");
});
@ -447,6 +463,51 @@ public class PathCheckPaneController implements Initializable {
this.compareMode = compareMode;
}
}
// ======================== 提取的样式变更方法 ========================
/**
* 为结果文本域添加错误态样式
*/
private void addResultErrorStyle() {
Platform.runLater(() -> {
result2TA.getStyleClass().add("result-error");
});
}
/**
* 为结果文本域添加成功态样式
*/
private void addResultSuccessfulStyle() {
Platform.runLater(() -> {
result2TA.getStyleClass().add("result-error");
});
}
/**
* 为结果文本域移除样式
*/
private void removeResultStyle() {
Platform.runLater(() -> {
result2TA.getStyleClass().remove("result-error");
result2TA.getStyleClass().remove("result-success");
});
}
/**
* 为开始按钮添加加载态样式
*/
private void addStartButtonLoadingStyle() {
Platform.runLater(() -> {
start2B.getStyleClass().add("loading");
});
}
/**
* 为开始按钮移除加载态样式
*/
private void removeStartButtonLoadingStyle() {
Platform.runLater(() -> {
start2B.getStyleClass().remove("loading");
});
}
// ====================================================================
}

View File

@ -1,5 +1,6 @@
package top.r3944realms.docchecktoolrefactored.ui.module;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
@ -50,6 +51,10 @@ public class StorageCarrierPaneController {
@FXML
private Button clearSelectedFoldersButton;
// 保存按钮原始文本用于状态恢复
private final String calculateHashOriginalText = "计算哈希值";
private final String generateHashOriginalText = "生成哈希值表文件";
private final top.r3944realms.docchecktoolrefactored.ui.utils.ProgressBar progressBar = new top.r3944realms.docchecktoolrefactored.ui.utils.ProgressBar(false);
@FXML
void onSelectLD(ActionEvent event) {
@ -81,7 +86,11 @@ public class StorageCarrierPaneController {
loadDigitalOutcomes.setText(currentText + File.pathSeparator + folderPath);
}
}
log.info(LoggerMarker.DEBUG_MARKER, "用户选择了文件夹: {}", selectedFolder.getAbsolutePath());
// 添加成功样式
applySuccessStyle(loadDigitalOutcomes);
} else {
log.info(LoggerMarker.DEBUG_MARKER, "用户取消了文件夹选择");
}
@ -93,6 +102,9 @@ public class StorageCarrierPaneController {
loadDigitalOutcomes.setText("");
result7TA.setText("已清除所有已选择的文件夹");
log.info(LoggerMarker.DEBUG_MARKER, "已清除所有已选择的文件夹");
// 移除样式
resetStyle(loadDigitalOutcomes);
}
@ -109,6 +121,9 @@ public class StorageCarrierPaneController {
System.setLastModifiedFile(selectedFile);
loadCompressedFile.setText(selectedFile.getAbsolutePath());
log.info(LoggerMarker.DEBUG_MARKER, "用户选择了RAR文件: {}", selectedFile.getAbsolutePath());
// 添加成功样式
applySuccessStyle(loadCompressedFile);
} else {
log.info(LoggerMarker.DEBUG_MARKER, "用户取消了RAR文件选择");
}
@ -124,6 +139,7 @@ public class StorageCarrierPaneController {
result7TA.setText("请先选择一个 .rar 文件");
DialogUtil.showWarningDialog("警告", "操作有误", "请先选择一个 .rar 文件");
generateHashFile7B.setDisable(false);
// 重置样式
return;
}
@ -136,16 +152,21 @@ public class StorageCarrierPaneController {
return;
}
try {
// 添加加载样式
applyLoadingStyle(generateHashFile7B, "处理中...");
log.info(LoggerMarker.DEBUG_MARKER, "开始计算RAR文件MD5哈希值: {}", filePath);
MD5HashCalculator hashCalculator = new MD5HashCalculator();
String hashResult = hashCalculator.calculateHash(file.toPath());
result7TA.setText("计算结果:\n" + hashResult);
applySuccessStyle(result7TA);
generateHashFile7B.setDisable(false);
log.info(LoggerMarker.DEBUG_MARKER, "文件哈希值计算完成: {}", hashResult);
} catch (IOException e) {
log.error(LoggerMarker.DEBUG_MARKER, "计算文件哈希值时出错: {}", filePath, e);
DialogUtil.showDetailedErrorDialog("错误", "生成哈希文件时出错:", e.getMessage());
generateHashFile7B.setDisable(false);
// 重置样式
resetButtonStyle(generateHashFile7B, generateHashOriginalText);
result7TA.setText("计算哈希值时出错: " + e.getMessage());
}
}
@ -179,7 +200,7 @@ public class StorageCarrierPaneController {
return;
}
}
applyLoadingStyle(caculateHash7B, "处理中...");
FileChooser fileChooser = System.getFileChooser();
fileChooser.setTitle("选择保存哈希列表文件的位置");
fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("CSV Files", "*.csv"));
@ -219,16 +240,18 @@ public class StorageCarrierPaneController {
};
task.progressProperty().addListener(progressChangeListener);
// 绑定任务的消息到结果文本区域实时显示进度
ChangeListener<String> messageChangeListener = (observable, oldValue, newValue) -> {
result7TA.setText(newValue);
};
task.messageProperty().addListener(messageChangeListener);
// ChangeListener<String> messageChangeListener = (observable, oldValue, newValue) -> {
// result7TA.setText(newValue);
// };
// task.messageProperty().addListener(messageChangeListener);
// 任务成功完成
task.setOnSucceeded(e -> {
progressBar.closeProgress();
log.info(LoggerMarker.DEBUG_MARKER, "哈希文件生成任务成功完成");
caculateHash7B.setDisable(false);
applySuccessStyle(result7TA);
resetButtonStyle(caculateHash7B, calculateHashOriginalText);
result7TA.setText(task.getValue());
});
@ -237,10 +260,12 @@ public class StorageCarrierPaneController {
progressBar.closeProgress();
Throwable exception = task.getException();
task.progressProperty().removeListener(progressChangeListener);
task.messageProperty().removeListener(messageChangeListener);
// task.messageProperty().removeListener(messageChangeListener);
caculateHash7B.setDisable(false);
String errorMsg = "生成哈希文件时出错: " + (exception != null ? exception.getMessage() : "未知错误");
applyErrorStyle(result7TA);
DialogUtil.showDetailedErrorDialog("错误", "生成哈希文件时出错", errorMsg);
resetButtonStyle(caculateHash7B, calculateHashOriginalText);
log.error(LoggerMarker.RELEASE_MARKER, "哈希文件生成任务失败", exception);
result7TA.setText(errorMsg);
});
@ -249,8 +274,10 @@ public class StorageCarrierPaneController {
task.setOnCancelled(e -> {
progressBar.closeProgress();
task.progressProperty().removeListener(progressChangeListener);
task.messageProperty().removeListener(messageChangeListener);
// task.messageProperty().removeListener(messageChangeListener);
caculateHash7B.setDisable(false);
resetStyle(result7TA);
resetButtonStyle(caculateHash7B, calculateHashOriginalText);
log.info(LoggerMarker.DEBUG_MARKER, "哈希文件生成任务被用户取消");
result7TA.setText("哈希文件生成操作已取消");
});
@ -260,7 +287,54 @@ public class StorageCarrierPaneController {
thread.setDaemon(true);
thread.start();
}
// ======================== 提取的样式变更方法 ========================
// 样式控制工具方法
private void applyLoadingStyle(Button button, String text) {
Platform.runLater(() -> {
button.setText(text);
button.getStyleClass().add("loading");
});
}
private void resetButtonStyle(Button button, String originalText) {
Platform.runLater(() -> {
button.setText(originalText);
button.getStyleClass().remove("loading");
});
}
private void applySuccessStyle(TextField textField) {
Platform.runLater(() -> {
textField.getStyleClass().remove("error");
textField.getStyleClass().add("success");
});
}
private void applySuccessStyle(TextArea textArea) {
Platform.runLater(() -> {
textArea.getStyleClass().removeAll("error");
textArea.getStyleClass().add("success");
});
}
private void applyErrorStyle(TextArea textArea) {
Platform.runLater(() -> {
textArea.getStyleClass().removeAll("success");
textArea.getStyleClass().add("error");
});
}
private void resetStyle(TextField textField) {
Platform.runLater(() -> {
textField.getStyleClass().removeAll("success", "error");
});
}
private void resetStyle(TextArea textArea) {
Platform.runLater(() -> {
textArea.getStyleClass().removeAll("success", "error");
});
}
// ====================================================================
}

View File

@ -66,16 +66,13 @@ public class DuplicateDocumentDetectionTask extends Task<String>{
@Override
public void onPhaseProgress(DuplicateFinder.Phase phase, int current, int total) {
if (total > 0) {
updateProgress(current, total);
switch (phase) {
case GROUP_BY_SIZE:
totalFiles.set(total);
updateMessage(String.format("正在按文件大小分组: %d/%d", current, total));
break;
case CALCULATE_HASH:
updateMessage(String.format("正在计算哈希值: %d/%d", current, total));
break;
}
// 控制更新频率
String msg = switch (phase) {
case GROUP_BY_SIZE -> String.format("正在按文件大小分组: %d/%d", current, total);
case CALCULATE_HASH -> String.format("正在计算哈希值: %d/%d", current, total);
};
updateMessage(msg);
updateProgress(current, total);
}
}

View File

@ -0,0 +1,93 @@
/* 全局样式 */
.root {
-fx-background-color: #F9FAFB;
-fx-font-family: "Microsoft YaHei", "SimHei", sans-serif;
}
/* 标签样式 */
Label {
-fx-text-fill: #111827;
-fx-font-size: 14px;
-fx-font-weight: 500;
}
/* 文本输入框样式 */
TextField {
-fx-background-color: #FFFFFF;
-fx-border-color: #E5E7EB;
-fx-border-width: 1px;
-fx-border-radius: 4px;
-fx-text-fill: #111827;
-fx-font-size: 14px;
-fx-padding: 6px 8px;
-fx-pref-height: 36px;
}
TextField:focused {
-fx-border-color: #1A56DB;
-fx-border-width: 2px;
-fx-background-insets: 0;
-fx-effect: dropshadow(gaussian, rgba(26, 86, 219, 0.2), 4, 0, 0, 1);
}
TextField:hover {
-fx-border-color: #9CA3AF;
}
TextField:disabled {
-fx-background-color: #F3F4F6;
-fx-text-fill: #9CA3AF;
-fx-border-color: #E5E7EB;
}
/* 按钮样式 */
Button {
-fx-background-color: #1A56DB;
-fx-text-fill: #FFFFFF;
-fx-font-size: 14px;
-fx-font-weight: 500;
-fx-border-radius: 4px;
-fx-background-radius: 4px;
-fx-cursor: hand;
}
Button:hover {
-fx-background-color: #1E40AF;
}
Button:pressed {
-fx-background-color: #1E3A8A;
}
Button:armed {
-fx-effect: none;
}
/* 重置按钮特殊样式 */
#infoResetB {
-fx-background-color: #FFFFFF;
-fx-text-fill: #1A56DB;
-fx-border-color: #1A56DB;
-fx-border-width: 1px;
}
#infoResetB:hover {
-fx-background-color: #EFF6FF;
}
/* 网格面板样式 */
GridPane {
-fx-hgap: 16px;
-fx-vgap: 12px;
}
/* 错误状态样式 */
.error {
-fx-border-color: #DC2626 !important;
}
/* 只读状态样式 */
.read-only {
-fx-background-color: #F3F4F6;
-fx-cursor: default;
}

View File

@ -0,0 +1,159 @@
/* 1. 全局基础样式:统一视觉基调 */
.root {
-fx-background-color: #F9FAFB; /* 符合政企规范的浅灰背景,降低视觉疲劳 */
-fx-font-family: "Microsoft YaHei", "SimHei", sans-serif; /* 适配中文显示 */
-fx-font-size: 14px; /* 基础字号,保证可读性 */
}
/* 2. 网格布局样式:优化间距与对齐 */
GridPane {
-fx-hgap: 16px; /* 列间距统一,避免元素拥挤 */
-fx-vgap: 12px; /* 行间距统一,区分功能区域 */
-fx-alignment: TOP_LEFT; /* 整体左对齐,符合政企软件操作习惯 */
}
/* 3. 标签样式:明确信息层级 */
Label {
-fx-text-fill: #111827; /* 主文本色,保证清晰度 */
-fx-font-weight: 500; /* 标签文字稍粗,突出引导性 */
-fx-padding: 4px 0; /* 上下内边距,避免与输入框垂直错位 */
}
/* 特殊标签:功能标题(如“工作内容”)强化区分 */
Label[text="工作内容:"],
Label[text="结果反馈:"],
Label[text="载入文件夹:"] {
-fx-text-fill: #1A56DB; /* 主色调强调,突出核心功能区标题 */
-fx-font-weight: 600;
}
/* 4. 文本输入框样式:适配文件路径输入场景 */
TextField {
-fx-background-color: #FFFFFF; /* 白色背景,保证输入内容清晰 */
-fx-border-color: #E5E7EB; /* 淡灰边框,区分输入区域 */
-fx-border-width: 1px;
-fx-border-radius: 4px; /* 圆角设计,避免尖锐感 */
-fx-text-fill: #111827;
-fx-padding: 8px 12px; /* 内边距充足,输入文字不贴边 */
-fx-pref-height: 36px; /* 统一高度,与按钮视觉对齐 */
-fx-cursor: text; /* 文本光标,明确可输入状态 */
}
/* 输入框交互状态:提升操作反馈 */
TextField:focused {
-fx-border-color: #1A56DB; /* 聚焦时主色边框,明确当前操作项 */
-fx-border-width: 2px;
-fx-background-insets: 0; /* 消除聚焦时默认内边距偏移 */
-fx-effect: dropshadow(gaussian, rgba(26, 86, 219, 0.2), 4, 0, 0, 1); /* 轻微阴影,增强层次感 */
}
TextField:hover {
-fx-border-color: #9CA3AF; /* 悬停时边框加深,提示可交互 */
}
TextField:disabled {
-fx-background-color: #F3F4F6; /* 禁用时浅灰背景,区分不可操作状态 */
-fx-text-fill: #9CA3AF; /* 禁用文本色减淡 */
-fx-border-color: #E5E7EB;
}
/* 5. 文本域样式:适配结果展示与操作指引 */
TextArea {
-fx-background-color: #FFFFFF;
-fx-border-color: #E5E7EB;
-fx-border-width: 1px;
-fx-border-radius: 4px;
-fx-text-fill: #111827;
-fx-padding: 12px; /* 内边距充足,避免文字贴边 */
-fx-font-size: 14px;
-fx-wrap-text: true; /* 自动换行,适配长文本(如文件路径、检查结果) */
-fx-line-spacing: 6px; /* 行间距优化,提升多行文本质感 */
}
/* 结果展示文本域result1TA强化可读性 */
#result1TA {
-fx-pref-height: 580px; /* 适配FXML中结果区域高度避免滚动条过多 */
-fx-background-color: #FCFCFD; /* 比普通文本域稍浅,突出结果内容 */
}
/* 操作指引文本域:区分功能属性 */
TextArea[text*="点击“选择文件夹”按钮"] {
-fx-text-fill: #4B5563; /* 次要文本色,避免与核心结果冲突 */
-fx-background-color: #F9FAFB; /* 背景与面板一致,突出“指引”属性 */
-fx-border-color: #E5E7EB;
}
/* 文本域交互状态:与输入框保持一致 */
TextArea:focused {
-fx-border-color: #1A56DB;
-fx-border-width: 2px;
-fx-effect: dropshadow(gaussian, rgba(26, 86, 219, 0.2), 4, 0, 0, 1);
}
/* 6. 按钮样式:区分功能优先级 */
Button {
-fx-border-radius: 4px;
-fx-background-radius: 4px;
-fx-font-size: 14px;
-fx-font-weight: 500;
-fx-padding: 8px 16px;
-fx-cursor: hand; /* 手型光标,提示可点击 */
-fx-alignment: CENTER; /* 文字居中,保证视觉整齐 */
}
/* 6.1 核心操作按钮:开始检查(高优先级) */
#start1B {
-fx-background-color: #1A56DB; /* 主色调,突出核心功能 */
-fx-text-fill: #FFFFFF;
-fx-pref-height: 44px; /* 稍高高度,强化视觉权重 */
}
#start1B:hover {
-fx-background-color: #1E40AF; /* hover时加深提升反馈 */
}
#start1B:pressed {
-fx-background-color: #1E3A8A; /* 点击时进一步加深,模拟按压感 */
}
#start1B:disabled {
-fx-background-color: #94A3B8; /* 禁用时灰色,明确不可操作 */
-fx-cursor: default;
}
/* 6.2 辅助操作按钮:选择文件夹(中优先级) */
#selectLoadFolder1B {
-fx-background-color: #FFFFFF; /* 白色背景,次要功能属性 */
-fx-text-fill: #1A56DB; /* 主色文字,保持视觉关联 */
-fx-border-color: #1A56DB;
-fx-border-width: 1px;
-fx-pref-height: 36px; /* 与输入框高度一致,视觉对齐 */
}
#selectLoadFolder1B:hover {
-fx-background-color: #EFF6FF; /* hover时淡蓝背景提示交互 */
}
#selectLoadFolder1B:pressed {
-fx-background-color: #DBEAFE;
}
/* 6.3 取消操作按钮:取消检查(低优先级,危险属性) */
#cancel1B {
-fx-background-color: #FFFFFF;
-fx-text-fill: #DC2626; /* 警示色文字,提示“取消”的中断属性 */
-fx-border-color: #DC2626;
-fx-border-width: 1px;
-fx-pref-height: 36px;
}
#cancel1B:hover {
-fx-background-color: #FEF2F2; /* hover时淡红背景强化警示 */
}
#cancel1B:pressed {
-fx-background-color: #FEE2E2;
}
/* 7. 特殊状态样式:适配业务场景 */
/* 7.1 加载中状态(可配合控制器动态添加) */
.loading {
-fx-background-color: #F3F4F6;
-fx-cursor: wait; /* 等待光标,提示正在处理 */
}
/* 7.2 结果异常状态(如重复文件提示) */
.result-error {
-fx-background-color: #DC2626; /* 错误色,突出异常结果 */
-fx-font-weight: 600;
}
/* 7.3 结果正常状态(如检查完成提示) */
.result-success {
-fx-background-color: #059669; /* 成功色,传递正常反馈 */
-fx-font-weight: 600;
}

View File

@ -0,0 +1,207 @@
/* 1. 全局基础样式:统一视觉基调 */
.root {
-fx-background-color: #F9FAFB; /* 浅灰背景,符合政企软件简洁专业风格 */
-fx-font-family: "Microsoft YaHei", "SimHei", sans-serif; /* 适配中文显示,避免字体错乱 */
-fx-font-size: 14px; /* 基础字号,保证不同设备可读性 */
}
/* 2. 网格布局样式:优化功能区域间距与对齐 */
GridPane {
-fx-hgap: 16px; /* 列间距统一,避免元素拥挤(适配多输入框/按钮布局) */
-fx-vgap: 12px; /* 行间距统一,清晰区分“选择区”“操作区”“结果区” */
-fx-alignment: TOP_LEFT; /* 整体左对齐,符合政企用户操作习惯 */
}
/* 3. 标签样式:明确信息层级,突出引导性 */
Label {
-fx-text-fill: #111827; /* 主文本色,保证清晰度 */
-fx-font-weight: 500; /* 标签文字稍粗,突出输入引导 */
-fx-padding: 6px 0; /* 上下内边距,避免与输入组件垂直错位 */
-fx-pref-width: 100px; /* 统一标签宽度,使输入框对齐(适配“载入目录”“载入文件夹”等标签) */
}
/* 特殊标签:功能标题强化(如“工作内容”“结果反馈”) */
Label[text="工作内容:"],
Label[text="结果反馈:"] {
-fx-text-fill: #1A56DB; /* 主色调强调,明确核心功能区边界 */
-fx-font-weight: 600;
-fx-pref-width: 80px; /* 适配右侧指引区域宽度 */
}
/* 4. 下拉选择框ChoiceBox样式适配“页面级/文件级”选择场景 */
ChoiceBox {
-fx-background-color: #FFFFFF; /* 白色背景,保证选项清晰 */
-fx-border-color: #E5E7EB; /* 淡灰边框,区分选择区域 */
-fx-border-width: 1px;
-fx-border-radius: 4px; /* 圆角设计,避免尖锐感 */
-fx-text-fill: #111827;
-fx-padding: 8px 12px; /* 内边距充足,选项文字不贴边 */
-fx-pref-height: 36px; /* 与输入框/按钮高度一致,视觉对齐 */
-fx-cursor: hand; /* 手型光标,提示可展开选择 */
}
/* 下拉框交互状态:提升操作反馈 */
ChoiceBox:hover {
-fx-border-color: #9CA3AF; /* 悬停时边框加深,提示可交互 */
}
ChoiceBox:focused {
-fx-border-color: #1A56DB; /* 聚焦时主色边框,明确当前操作项 */
-fx-border-width: 2px;
-fx-effect: dropshadow(gaussian, rgba(26, 86, 219, 0.2), 4, 0, 0, 1); /* 轻微阴影,增强层次感 */
}
/* 下拉选项面板样式:与选择框视觉统一 */
ChoiceBox .context-menu {
-fx-background-color: #FFFFFF;
-fx-border-color: #E5E7EB;
-fx-border-radius: 4px;
-fx-padding: 4px 0;
}
ChoiceBox .menu-item {
-fx-padding: 8px 16px;
-fx-font-size: 14px;
}
ChoiceBox .menu-item:hover {
-fx-background-color: #EFF6FF; /* 选项悬停淡蓝背景,与主色调呼应 */
-fx-text-fill: #1A56DB;
}
/* 5. 文本输入框样式:适配路径显示场景 */
TextField {
-fx-background-color: #FFFFFF;
-fx-border-color: #E5E7EB;
-fx-border-width: 1px;
-fx-border-radius: 4px;
-fx-text-fill: #111827;
-fx-padding: 8px 12px; /* 内边距充足,长路径文字不贴边 */
-fx-pref-height: 36px; /* 统一高度,与按钮/下拉框对齐 */
-fx-cursor: text;
}
/* 输入框交互状态:与其他组件保持一致 */
TextField:focused {
-fx-border-color: #1A56DB;
-fx-border-width: 2px;
-fx-background-insets: 0;
-fx-effect: dropshadow(gaussian, rgba(26, 86, 219, 0.2), 4, 0, 0, 1);
}
TextField:hover {
-fx-border-color: #9CA3AF;
}
TextField:disabled {
-fx-background-color: #F3F4F6; /* 禁用时浅灰背景,区分不可操作状态 */
-fx-text-fill: #9CA3AF;
-fx-border-color: #E5E7EB;
}
/* 6. 文本域样式:区分“结果展示”与“操作指引” */
TextArea {
-fx-background-color: #FFFFFF;
-fx-border-color: #E5E7EB;
-fx-border-width: 1px;
-fx-border-radius: 4px;
-fx-text-fill: #111827;
-fx-padding: 12px; /* 内边距充足,避免文字贴边 */
-fx-font-size: 14px;
-fx-wrap-text: true; /* 自动换行,适配长路径比对结果 */
-fx-line-spacing: 6px; /* 行间距优化,提升多行文本质感 */
-fx-pref-height: 550px; /* 适配FXML中结果区域高度减少滚动条干扰 */
}
/* 核心结果文本域result2TA强化可读性 */
#result2TA {
-fx-background-color: #FCFCFD; /* 比普通文本域稍浅,突出结果内容 */
-fx-pref-width: 800px; /* 适配左侧结果区域宽度,避免文字过宽 */
}
/* 操作指引文本域:区分功能属性 */
TextArea[text*="选择“页面级”"] {
-fx-text-fill: #4B5563; /* 次要文本色,避免与核心结果冲突 */
-fx-background-color: #F9FAFB; /* 背景与面板一致,突出“指引”属性 */
-fx-border-color: #E5E7EB;
-fx-pref-width: 400px; /* 适配右侧指引区域宽度 */
}
/* 文本域交互状态:与输入框保持一致 */
TextArea:focused {
-fx-border-color: #1A56DB;
-fx-border-width: 2px;
-fx-effect: dropshadow(gaussian, rgba(26, 86, 219, 0.2), 4, 0, 0, 1);
}
/* 7. 按钮样式:按功能优先级区分,引导操作流程 */
Button {
-fx-border-radius: 4px;
-fx-background-radius: 4px;
-fx-font-size: 14px;
-fx-font-weight: 500;
-fx-padding: 8px 16px;
-fx-cursor: hand; /* 手型光标,提示可点击 */
-fx-alignment: CENTER; /* 文字居中,保证视觉整齐 */
-fx-pref-height: 36px; /* 统一高度,与输入框/下拉框对齐 */
}
/* 7.1 核心操作按钮:开始比对(最高优先级) */
#start2B {
-fx-background-color: #1A56DB; /* 主色调,突出“比对”核心功能 */
-fx-text-fill: #FFFFFF;
-fx-pref-height: 44px; /* 稍高高度,强化视觉权重(适配多按钮布局中的焦点引导) */
-fx-pref-width: 800px; /* 适配FXML中按钮宽度保证操作区域完整 */
}
#start2B:hover {
-fx-background-color: #1E40AF; /* hover时加深提升反馈 */
}
#start2B:pressed {
-fx-background-color: #1E3A8A; /* 点击时进一步加深,模拟按压感 */
}
#start2B:disabled {
-fx-background-color: #94A3B8; /* 禁用时灰色,明确不可操作 */
-fx-cursor: default;
}
/* 7.2 辅助选择按钮:选择文件/文件夹(中优先级) */
#selectLoadCatalog2B,
#selectJPGFolder2B {
-fx-background-color: #FFFFFF; /* 白色背景,次要功能属性 */
-fx-text-fill: #1A56DB; /* 主色文字,保持视觉关联 */
-fx-border-color: #1A56DB;
-fx-border-width: 1px;
}
#selectLoadCatalog2B:hover,
#selectJPGFolder2B:hover {
-fx-background-color: #EFF6FF; /* hover时淡蓝背景提示交互 */
}
#selectLoadCatalog2B:pressed,
#selectJPGFolder2B:pressed {
-fx-background-color: #DBEAFE;
}
/* 7.3 生成操作按钮:生成地址文件(中优先级,功能关联) */
#generateLogicalAddress2B,
#generatePhysicalAddress2B {
-fx-background-color: #059669; /* 成功色,传递“生成文件”的正向功能属性 */
-fx-text-fill: #FFFFFF;
}
#generateLogicalAddress2B:hover,
#generatePhysicalAddress2B:hover {
-fx-background-color: #047857; /* hover时加深提升反馈 */
}
#generateLogicalAddress2B:pressed,
#generatePhysicalAddress2B:pressed {
-fx-background-color: #065F46;
}
#generateLogicalAddress2B:disabled,
#generatePhysicalAddress2B:disabled {
-fx-background-color: #6B7280; /* 禁用时灰色,明确不可操作 */
-fx-cursor: default;
}
/* 8. 特殊状态样式:适配业务场景需求 */
/* 8.1 加载中状态(配合控制器动态添加,如比对过程中) */
.loading {
-fx-background-color: #F3F4F6;
-fx-cursor: wait; /* 等待光标,提示正在处理 */
}
/* 7.2 结果异常状态(如对比发现有问题,或者无法生成逻辑文件) */
.result-error {
-fx-background-color: #DC2626; /* 警示色,突出路径差异结果 */
-fx-font-weight: 600;
}
/* 8.3 比对正常状态(结果区域高亮成功) */
.result-success {
-fx-background-color: #059669; /* 成功色,传递“无差异”反馈 */
-fx-font-weight: 600;
}

View File

@ -0,0 +1,32 @@
/* 1. 全局基础样式:奠定专业简洁基调 */
.root {
-fx-background-color: #F9FAFB; /* 浅灰背景,符合政企软件低视觉疲劳需求 */
-fx-font-family: "Microsoft YaHei", "SimHei", sans-serif; /* 适配中文显示,避免字体模糊 */
}
/* 2. 锚点布局样式:确保内容全屏适配 */
AnchorPane {
-fx-padding: 24px; /* 充足内边距避免文本贴边适配800×1000px面板尺寸 */
}
/* 3. 核心文本域样式:优化验收标准可读性 */
TextArea {
/* 基础视觉属性 */
-fx-background-color: #FFFFFF; /* 白色背景,突出文本内容 */
-fx-border-color: #E5E7EB; /* 淡灰边框,明确内容区域边界 */
-fx-border-width: 1px;
-fx-border-radius: 4px; /* 圆角设计,避免尖锐感,提升专业度 */
-fx-pref-width: 100%; /* 宽度全屏适配符合FXML中1000px预设 */
-fx-pref-height: 100%; /* 高度全屏适配符合FXML中800px预设 */
-fx-wrap-text: true; /* 强制自动换行,避免横向滚动条(适配长句说明) */
/* 文本样式优化:突出层级与重点 */
-fx-font-size: 18px; /* 匹配FXML预设字号保证远距离阅读清晰度 */
-fx-text-fill: #111827; /* 主文本色,确保长时间阅读不费力 */
-fx-line-spacing: 12px; /* 增大行间距区分不同验收步骤比默认多50%,提升可读性) */
-fx-letter-spacing: 0.5px; /* 轻微字间距,优化中文“著录”“倾斜度”等专业术语识别 */
/* 交互体验弱化编辑属性因editable="false" */
-fx-cursor: default; /* 默认光标,明确不可编辑状态 */
-fx-focus-traversable: false; /* 取消焦点边框,避免用户误解“可操作” */
}

View File

@ -0,0 +1,197 @@
/* 1. 全局基础样式:奠定专业简洁基调 */
.root {
-fx-background-color: #F9FAFB; /* 浅灰背景,符合政企软件低视觉疲劳需求 */
-fx-font-family: "Microsoft YaHei", "SimHei", sans-serif; /* 适配中文显示,避免字体模糊 */
-fx-font-size: 14px; /* 基础字号,保证各组件文本一致性 */
}
/* 2. 网格布局样式:优化多组件排版一致性 */
GridPane {
-fx-hgap: 12px; /* 列间距适配多按钮/输入框布局,避免拥挤 */
-fx-vgap: 16px; /* 行间距区分“加载区”“操作区”“结果区”,提升层次感 */
-fx-alignment: TOP_LEFT; /* 整体左对齐,符合政企用户操作习惯 */
-fx-padding: 10px; /* 与FXML中padding呼应确保整体边距统一 */
}
/* 3. 标签样式:明确功能引导,突出核心提示 */
Label {
-fx-text-fill: #111827; /* 主文本色,保证清晰度 */
-fx-font-weight: 500; /* 标签文字稍粗,突出输入引导 */
-fx-pref-width: 120px; /* 统一标签宽度,使“载入数字化成果”“载入压缩包”等输入框对齐 */
}
/* 修复压缩包提示标签显示不全:专项样式 */
/* 匹配文本内容的标签(避免影响其他标签) */
Label[text*="将档案目录、哈希值列表文件"] {
/* 1. 宽度适配强制占满父容器GridPane避免列宽限制截断 */
-fx-max-width: 100%; /* 最大宽度=父容器宽度1065px-20px内边距=1045px */
-fx-pref-width: 100%; /* 优先使用100%宽度覆盖原prefWidth="740.0" */
/* 2. 文本换行:允许长文本折行,避免横向溢出 */
-fx-wrap-text: true; /* 核心属性开启自动换行默认false */
-fx-text-alignment: CENTER; /* 保持居中对齐,符合提示属性 */
/* 3. 内边距与间距:避免文本贴边,提升可读性 */
/* 4. 视觉强化:保持原提示属性,突出核心要求 */
-fx-text-fill: #1A56DB; /* 主色调强调 */
-fx-font-weight: 600;
-fx-font-size: 140px;
}
/* 特殊标签2功能标题如“工作内容”“结果反馈” */
Label[text="工作内容:"],
Label[text="结果反馈:"] {
-fx-text-fill: #1A56DB; /* 主色调强调,明确功能区边界 */
-fx-font-weight: 600;
-fx-pref-width: 80px; /* 适配右侧指引区域宽度 */
}
/* 4. 文本输入框样式:适配文件路径与成果信息展示 */
TextField {
-fx-background-color: #FFFFFF; /* 白色背景,保证输入内容清晰 */
-fx-border-color: #E5E7EB; /* 淡灰边框,区分输入区域 */
-fx-border-width: 1px;
-fx-border-radius: 4px; /* 圆角设计,避免尖锐感 */
-fx-text-fill: #111827;
-fx-padding: 8px 12px; /* 内边距充足,长文件路径不贴边 */
-fx-pref-height: 36px; /* 统一高度,与按钮视觉对齐 */
-fx-cursor: text; /* 文本光标,明确可输入/选择状态 */
-fx-hgrow: ALWAYS; /* 自适应列宽符合FXML中hgrow="ALWAYS"设置 */
}
/* 输入框交互状态:提升操作反馈 */
TextField:focused {
-fx-border-color: #1A56DB; /* 聚焦时主色边框,明确当前操作项 */
-fx-border-width: 2px;
-fx-background-insets: 0;
-fx-effect: dropshadow(gaussian, rgba(26, 86, 219, 0.2), 4, 0, 0, 1); /* 轻微阴影,增强层次感 */
}
TextField:hover {
-fx-border-color: #9CA3AF; /* 悬停时边框加深,提示可交互 */
}
TextField:disabled {
-fx-background-color: #F3F4F6; /* 禁用时浅灰背景,区分不可操作状态 */
-fx-text-fill: #9CA3AF;
-fx-border-color: #E5E7EB;
}
/* 5. 文本域样式:区分“结果展示”与“操作指引” */
TextArea {
-fx-background-color: #FFFFFF;
-fx-border-color: #E5E7EB;
-fx-border-width: 1px;
-fx-border-radius: 4px;
-fx-text-fill: #111827;
-fx-padding: 12px; /* 内边距充足,避免文字贴边 */
-fx-font-size: 14px;
-fx-wrap-text: true; /* 自动换行,适配长步骤说明与哈希结果 */
-fx-line-spacing: 8px; /* 行间距优化,提升多行文本质感 */
-fx-pref-height: 580px; /* 适配FXML中结果区域高度减少滚动条干扰 */
}
/* 核心结果文本域result7TA强化哈希结果可读性 */
#result7TA {
-fx-background-color: #FCFCFD; /* 比普通文本域稍浅,突出结果内容 */
-fx-pref-width: 600px; /* 适配左侧结果区域宽度,避免文字过宽 */
}
/* 操作指引文本域:区分功能属性 */
TextArea[text*="对照《存储载体检查登记表》"] {
-fx-text-fill: #4B5563; /* 次要文本色,避免与核心结果冲突 */
-fx-background-color: #F9FAFB; /* 背景与面板一致,突出“指引”属性 */
-fx-border-color: #E5E7EB;
-fx-pref-width: 400px; /* 适配右侧指引区域宽度 */
}
/* 文本域交互状态弱化编辑属性因editable="false" */
TextArea {
-fx-cursor: default; /* 默认光标,明确不可编辑状态 */
}
TextArea:focused {
-fx-border-color: #1A56DB; /* 聚焦时仍保留边框反馈,避免用户误解“无响应” */
-fx-border-width: 2px;
}
/* 6. 按钮样式:按功能优先级区分,引导“加载-计算-打包-验证”流程 */
Button {
-fx-border-radius: 4px;
-fx-background-radius: 4px;
-fx-font-size: 14px;
-fx-font-weight: 500;
-fx-padding: 8px 16px;
-fx-cursor: hand; /* 手型光标,提示可点击 */
-fx-alignment: CENTER; /* 文字居中,保证视觉整齐 */
-fx-pref-height: 36px; /* 统一高度,与输入框对齐 */
}
/* 6.1 核心操作按钮:生成哈希值/计算哈希值(高优先级) */
#generateHashFile7B,
#caculateHash7B {
-fx-background-color: #1A56DB; /* 主色调,突出“哈希计算”核心功能(数据完整性验证关键步骤) */
-fx-text-fill: #FFFFFF;
-fx-pref-width: 160px; /* 适配按钮文本长度,避免文字换行 */
}
#generateHashFile7B:hover,
#caculateHash7B:hover {
-fx-background-color: #1E40AF; /* hover时加深提升反馈 */
}
#generateHashFile7B:pressed,
#caculateHash7B:pressed {
-fx-background-color: #1E3A8A; /* 点击时进一步加深,模拟按压感 */
}
#generateHashFile7B:disabled,
#caculateHash7B:disabled {
-fx-background-color: #94A3B8; /* 禁用时灰色,明确不可操作(如未选择文件时) */
-fx-cursor: default;
}
/* 6.2 辅助选择按钮:选择文件(中优先级) */
#selectLoadDigitalOutcomes7B,
#selectLoadCompressedFile7B {
-fx-background-color: #FFFFFF; /* 白色背景,次要功能属性 */
-fx-text-fill: #1A56DB; /* 主色文字,保持视觉关联 */
-fx-border-color: #1A56DB;
-fx-border-width: 1px;
-fx-pref-width: 100px; /* 适配“选择文件”文本长度 */
}
#selectLoadDigitalOutcomes7B:hover,
#selectLoadCompressedFile7B:hover {
-fx-background-color: #EFF6FF; /* hover时淡蓝背景提示交互 */
}
#selectLoadDigitalOutcomes7B:pressed,
#selectLoadCompressedFile7B:pressed {
-fx-background-color: #DBEAFE;
}
/* 6.3 清除操作按钮:清除选择(低优先级,辅助功能) */
#clearSelectedFoldersButton {
-fx-background-color: #FFFFFF;
-fx-text-fill: #6B7280; /* 浅灰文字,弱化次要功能视觉权重 */
-fx-border-color: #E5E7EB; /* 淡灰边框,区分按钮区域 */
-fx-border-width: 1px;
-fx-pref-width: 80px; /* 适配“清除”文本长度 */
}
#clearSelectedFoldersButton:hover {
-fx-background-color: #F3F4F6; /* hover时浅灰背景提示交互 */
-fx-text-fill: #111827; /* hover时文字加深提升可读性 */
}
#clearSelectedFoldersButton:pressed {
-fx-background-color: #E5E7EB;
}
/* 7. 特殊状态样式:适配哈希计算与压缩包验证场景 */
/* 7.1 加载中状态(如哈希计算过程中) */
.loading {
-fx-background-color: #F3F4F6;
-fx-cursor: wait; /* 等待光标,提示正在处理 */
}
/* 7.2 成功状态(结果区域高亮) */
.success {
-fx-background-color: #059669; /* 成功色,传递“哈希值一致”反馈 */
-fx-font-weight: 600;
}
/* 7.3 失败状态(结果区域高亮) */
.error {
-fx-background-color: #DC2626; /* 警示色,突出“哈希值不一致”风险 */
-fx-font-weight: 600;
}
/* 7.4 压缩包提示高亮(文本域内关键信息) */
.package-highlight {
-fx-background-color: #1A56DB; /* 主色调,突出“数字化验收检测包.rar”核心文件名 */
-fx-font-weight: 600;
}

View File

@ -9,7 +9,7 @@
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.text.Font?>
<GridPane xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="top.r3944realms.docchecktoolrefactored.ui.module.ProjectInfoPaneController">
<GridPane stylesheets="@../../css/project-info-pane.css" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="top.r3944realms.docchecktoolrefactored.ui.module.ProjectInfoPaneController">
<columnConstraints>
<ColumnConstraints hgrow="ALWAYS" maxWidth="-Infinity" minWidth="10.0" prefWidth="80.0" />
<ColumnConstraints hgrow="ALWAYS" minWidth="10.0" prefWidth="100.0" />
@ -134,7 +134,7 @@
<Font size="14.0" />
</font>
</TextField>
<Button fx:id="infoResetB" mnemonicParsing="false" onAction="#onReset" prefHeight="93.0" prefWidth="55.0" text="重置" GridPane.columnIndex="4" GridPane.rowSpan="4">
<Button id="infoResetB " fx:id="infoResetB" mnemonicParsing="false" onAction="#onReset" prefHeight="93.0" prefWidth="55.0" text="重置" GridPane.columnIndex="4" GridPane.rowSpan="4">
<GridPane.margin>
<Insets bottom="10.0" left="20.0" right="10.0" top="10.0" />
</GridPane.margin>

View File

@ -10,10 +10,10 @@
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.text.Font?>
<GridPane prefHeight="800.0" prefWidth="1000.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="top.r3944realms.docchecktoolrefactored.ui.module.DuplicateDocumentPaneController">
<GridPane prefHeight="800.0" prefWidth="1000.0" stylesheets="@../../css/step-1-pane.css" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="top.r3944realms.docchecktoolrefactored.ui.module.DuplicateDocumentPaneController">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" maxWidth="288.0" minWidth="0.0" percentWidth="0.0" prefWidth="82.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="1263.9999633789064" minWidth="0.0" prefWidth="745.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="288.0" minWidth="0.0" percentWidth="0.0" prefWidth="113.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="1263.9999633789064" minWidth="0.0" prefWidth="479.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="873.0" minWidth="0.0" prefWidth="82.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="450.0" minWidth="10.0" prefWidth="400.0" />
<ColumnConstraints />
@ -25,7 +25,7 @@
<RowConstraints maxHeight="592.6666666666666" prefHeight="581.3333536783855" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<TextArea fx:id="result1TA" editable="false" prefHeight="414.0" prefWidth="683.0" GridPane.columnSpan="3" GridPane.rowIndex="3">
<TextArea id="result1TA" fx:id="result1TA" editable="false" prefHeight="414.0" prefWidth="683.0" GridPane.columnSpan="3" GridPane.rowIndex="3">
<GridPane.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</GridPane.margin>
@ -34,19 +34,19 @@
<GridPane.margin>
<Insets left="10.0" />
</GridPane.margin></Label>
<TextField fx:id="loadFolder1TF" GridPane.columnIndex="1">
<TextField fx:id="loadFolder1TF" prefHeight="37.0" prefWidth="430.0" GridPane.columnIndex="1">
<GridPane.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</GridPane.margin>
</TextField>
<Button fx:id="selectLoadFolder1B" mnemonicParsing="false" onAction="#onSelectFolder" text="选择文件夹" GridPane.columnIndex="3" GridPane.columnSpan="2" GridPane.halignment="CENTER" GridPane.valignment="CENTER">
<Button id="selectLoadFolder1B" fx:id="selectLoadFolder1B" mnemonicParsing="false" onAction="#onSelectFolder" text="选择文件夹" GridPane.columnIndex="3" GridPane.columnSpan="2" GridPane.halignment="CENTER" GridPane.valignment="CENTER">
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
<GridPane.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</GridPane.margin></Button>
<Button fx:id="start1B" minWidth="-Infinity" mnemonicParsing="false" onAction="#onStart" prefHeight="58.0" prefWidth="650.0" text="开始检查" GridPane.columnSpan="3" GridPane.halignment="LEFT" GridPane.rowIndex="1" GridPane.valignment="CENTER">
<Button id="start1B" fx:id="start1B" minWidth="-Infinity" mnemonicParsing="false" onAction="#onStart" prefHeight="47.0" prefWidth="582.0" text="开始检查" GridPane.columnSpan="3" GridPane.halignment="LEFT" GridPane.rowIndex="1" GridPane.valignment="CENTER">
<GridPane.margin>
<Insets bottom="2.0" left="10.0" right="2.0" top="2.0" />
</GridPane.margin>
@ -55,7 +55,7 @@
<GridPane.margin>
<Insets left="10.0" />
</GridPane.margin></Label>
<TextArea editable="false" maxWidth="1.7976931348623157E308" prefWidth="400.0" text="1.点击“选择文件夹”按钮,载入需要查找重复文件的数据(一般页面级文件和文件级文件分批载入检查)。&#10;2.点击“开始检查”按钮,软件将对选定区域的数据批量计算文件哈希值,并对比查找重复文件,“结果反馈”区域将显示扫描文件数量、重复文件组和重复文件数量。&#10;3.根据软件反馈的重复文件组,逐一核实确认是否为重复文件。&#10;4.将确认后的检查结果填入查重登记表附件1。" wrapText="true" GridPane.columnIndex="3" GridPane.columnSpan="2" GridPane.rowIndex="3">
<TextArea editable="false" maxWidth="1.7976931348623157E308" prefWidth="400.0" text="1.点击“选择文件夹”按钮,载入需要查找重复文件的数据(一般页面级文件和文件级文件分批载入检查)。&#10;&#10;2.点击“开始检查”按钮,软件将对选定区域的数据批量计算文件哈希值,并对比查找重复文件,“结果反馈”区域将显示扫描文件数量、重复文件组和重复文件数量。&#10;&#10;3.根据软件反馈的重复文件组,逐一核实确认是否为重复文件。&#10;&#10;4.将确认后的检查结果填入查重登记表附件1。" wrapText="true" GridPane.columnIndex="3" GridPane.columnSpan="2" GridPane.rowIndex="3">
<GridPane.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</GridPane.margin>
@ -71,7 +71,7 @@
<Insets left="10.0" />
</GridPane.margin>
</Label>
<Button fx:id="cancel1B" alignment="CENTER" mnemonicParsing="false" onAction="#onCancel" prefHeight="52.0" prefWidth="117.0" text="取消检查" GridPane.columnIndex="3" GridPane.rowIndex="1">
<Button id="cancel1B" fx:id="cancel1B" alignment="CENTER" mnemonicParsing="false" nodeOrientation="LEFT_TO_RIGHT" onAction="#onCancel" prefHeight="52.0" prefWidth="117.0" text="取消检查" GridPane.columnIndex="3" GridPane.columnSpan="2" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER">
<GridPane.margin>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</GridPane.margin>

View File

@ -11,7 +11,7 @@
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.text.Font?>
<GridPane prefHeight="800.0" prefWidth="1000.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="top.r3944realms.docchecktoolrefactored.ui.module.PathCheckPaneController">
<GridPane prefHeight="800.0" prefWidth="1000.0" stylesheets="@../../css/step-2-pane.css" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="top.r3944realms.docchecktoolrefactored.ui.module.PathCheckPaneController">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" maxWidth="940.0" minWidth="0.0" percentWidth="0.0" prefWidth="104.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="940.0" minWidth="10.0" percentWidth="0.0" prefWidth="104.0" />
@ -51,7 +51,7 @@
<Insets left="10.0" />
</GridPane.margin>
</Label>
<TextArea fx:id="result2TA" editable="false" GridPane.columnSpan="4" GridPane.rowIndex="4">
<TextArea id="result2TA" fx:id="result2TA" editable="false" GridPane.columnSpan="4" GridPane.rowIndex="4">
<padding>
<Insets bottom="2.0" left="2.0" right="2.0" top="2.0" />
</padding>
@ -59,7 +59,7 @@
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</GridPane.margin>
</TextArea>
<Button fx:id="start2B" mnemonicParsing="false" onAction="#onStart" prefHeight="75.0" prefWidth="800.0" text="开始比对" GridPane.columnSpan="4" GridPane.halignment="LEFT" GridPane.rowIndex="2" GridPane.valignment="CENTER">
<Button id="start2B" fx:id="start2B" mnemonicParsing="false" onAction="#onStart" prefHeight="75.0" prefWidth="800.0" text="开始比对" GridPane.columnSpan="4" GridPane.halignment="LEFT" GridPane.rowIndex="2" GridPane.valignment="CENTER">
<padding>
<Insets bottom="2.0" left="2.0" right="2.0" top="2.0" />
</padding>
@ -86,7 +86,7 @@
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</GridPane.margin>
</TextField>
<Button fx:id="selectLoadCatalog2B" mnemonicParsing="false" onAction="#onSelectLC" text=" 选择文件 " GridPane.columnIndex="3" GridPane.halignment="CENTER" GridPane.valignment="CENTER">
<Button id="selectLoadCatalog2B" fx:id="selectLoadCatalog2B" mnemonicParsing="false" onAction="#onSelectLC" text=" 选择文件 " GridPane.columnIndex="3" GridPane.halignment="CENTER" GridPane.valignment="CENTER">
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
@ -94,7 +94,7 @@
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</GridPane.margin>
</Button>
<Button fx:id="selectJPGFolder2B" mnemonicParsing="false" onAction="#onSelectJPGF" text=" 选择文件夹" GridPane.columnIndex="3" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER">
<Button id="selectJPGFolder2B" fx:id="selectJPGFolder2B" mnemonicParsing="false" onAction="#onSelectJPGF" text=" 选择文件夹" GridPane.columnIndex="3" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER">
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
@ -102,7 +102,7 @@
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</GridPane.margin>
</Button>
<Button fx:id="generateLogicalAddress2B" mnemonicParsing="false" onAction="#onGenerateLA" text="生成逻辑地址文件" GridPane.columnIndex="4" GridPane.halignment="CENTER" GridPane.valignment="CENTER">
<Button id="generateLogicalAddress2B" fx:id="generateLogicalAddress2B" mnemonicParsing="false" onAction="#onGenerateLA" text="生成逻辑地址文件" GridPane.columnIndex="4" GridPane.halignment="CENTER" GridPane.valignment="CENTER">
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
@ -110,7 +110,7 @@
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</GridPane.margin>
</Button>
<Button fx:id="generatePhysicalAddress2B" mnemonicParsing="false" onAction="#onGeneratePA" text="生成物理地址文件" GridPane.columnIndex="4" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER">
<Button id="generatePhysicalAddress2B" fx:id="generatePhysicalAddress2B" mnemonicParsing="false" onAction="#onGeneratePA" text="生成物理地址文件" GridPane.columnIndex="4" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER">
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
@ -118,7 +118,7 @@
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</GridPane.margin>
</Button>
<TextArea editable="false" prefHeight="450.0" prefWidth="400.0" text="1.选择“页面级”,载入目录,生成页面级逻辑地址;载入目录对应的页面级数据,生成页面级物理地址,用软件比对出差异,记录软件反馈结果。&#10;2.选择“文件级”,载入目录,生成文件级逻辑地址;载入目录对应的文件级数据,生成文件级物理地址,用软件比对出差异,记录软件反馈结果。&#10;3.逐一核实差异存在的原因,以判断目录和扫描数据存在的问题。&#10;4.根据核实的情况填写《查遗漏、查存储路径和命名规范登记表》附件2。&#10;&#10;" wrapText="true" GridPane.columnIndex="4" GridPane.rowIndex="4">
<TextArea editable="false" prefHeight="450.0" prefWidth="400.0" text="1.选择“页面级”,载入目录,生成页面级逻辑地址;载入目录对应的页面级数据,生成页面级物理地址,用软件比对出差异,记录软件反馈结果。&#10;&#10;2.选择“文件级”,载入目录,生成文件级逻辑地址;载入目录对应的文件级数据,生成文件级物理地址,用软件比对出差异,记录软件反馈结果。&#10;&#10;3.逐一核实差异存在的原因,以判断目录和扫描数据存在的问题。&#10;&#10;4.根据核实的情况填写《查遗漏、查存储路径和命名规范登记表》附件2。&#10;&#10;" wrapText="true" GridPane.columnIndex="4" GridPane.rowIndex="4">
<GridPane.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</GridPane.margin>

View File

@ -5,7 +5,7 @@
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>
<AnchorPane prefHeight="800.0" prefWidth="1000.0" xmlns="http://javafx.com/javafx/17">
<AnchorPane prefHeight="800.0" prefWidth="1000.0" stylesheets="@../../css/step-3456-pane.css" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1">
<children>
<TextArea editable="false" prefHeight="800.0" prefWidth="1000.0" scrollLeft="1.0" text="工作内容:&#10; 1.汇总前两步检查结果计算合格率合格率不是100%则验收不通过,要求整改。&#10; 2.若合格率达到100%则按总页数5%比例抽检:&#10; ①著录准确性/规范性/完整性要求100%合格率);&#10; ②图像清晰度/倾斜度/黑边要求95%以上的合格率);&#10; ③结果填入《质量检查登记表》附件3。" wrapText="true" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<font>

View File

@ -5,7 +5,7 @@
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>
<AnchorPane prefHeight="800.0" prefWidth="1000.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1">
<AnchorPane prefHeight="800.0" prefWidth="1000.0" stylesheets="@../../css/step-3456-pane.css" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1">
<children>
<TextArea editable="false" prefHeight="800.0" prefWidth="1000.0" scrollLeft="1.0" text="工作内容:&#10; 对照《元数据检查登记表》附件4检查并登记数字化项目信息、技术环境及技术参数的完整性等情况。" wrapText="true" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<font>

View File

@ -5,7 +5,7 @@
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>
<AnchorPane prefHeight="800.0" prefWidth="1000.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1">
<AnchorPane prefHeight="800.0" prefWidth="1000.0" stylesheets="@../../css/step-3456-pane.css" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1">
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>

View File

@ -5,7 +5,7 @@
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>
<AnchorPane prefHeight="800.0" prefWidth="1000.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1">
<AnchorPane prefHeight="800.0" prefWidth="1000.0" stylesheets="@../../css/step-3456-pane.css" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1">
<children>
<TextArea editable="false" prefHeight="800.0" prefWidth="1000.0" text="工作内容:&#10; 对照《工作记录检查登记表》附件6检查数字化工作台帐的规范性及与成果的一致性并在表格中登记检查情况。" wrapText="true" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<font>

View File

@ -10,11 +10,12 @@
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.text.Font?>
<GridPane prefHeight="800.0" prefWidth="1000.0" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="top.r3944realms.docchecktoolrefactored.ui.module.StorageCarrierPaneController">
<GridPane prefHeight="800.0" prefWidth="1065.0" stylesheets="@../../css/step-7-pane.css" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="top.r3944realms.docchecktoolrefactored.ui.module.StorageCarrierPaneController">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" maxWidth="226.33331298828125" minWidth="10.0" percentWidth="10.0" prefWidth="108.33333333333334" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="559.3333511352539" minWidth="10.0" percentWidth="40.0" prefWidth="373.00002034505206" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="345.3333435058594" minWidth="10.0" percentWidth="25.0" prefWidth="227.00004069010413" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="226.33331298828125" percentWidth="20.0" prefWidth="400.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="559.3333511352539" minWidth="10.0" percentWidth="40.0" prefWidth="202.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="559.3333511352539" minWidth="10.0" percentWidth="10.0" prefWidth="200.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="345.3333435058594" minWidth="10.0" percentWidth="25.0" prefWidth="227.0" />
<ColumnConstraints hgrow="SOMETIMES" maxWidth="500.0" minWidth="10.0" percentWidth="25.0" prefWidth="400.0" />
<ColumnConstraints />
</columnConstraints>
@ -25,7 +26,7 @@
<RowConstraints maxHeight="1.7976931348623157E308" prefHeight="581.3333536783855" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<Label text="载入数字化成果:">
<Label prefHeight="23.0" prefWidth="141.0" text="载入数字化成果:">
<padding>
<Insets bottom="2.0" left="2.0" right="2.0" top="2.0" />
</padding>
@ -33,15 +34,7 @@
<Insets left="5.0" />
</GridPane.margin>
</Label>
<Label text="将档案目录、哈希值列表文件和检测过程文件打包制成打包制成“数字化验收检测包.rar”压缩包" GridPane.columnSpan="5" GridPane.halignment="CENTER" GridPane.rowSpan="2" GridPane.valignment="CENTER">
<padding>
<Insets bottom="2.0" left="2.0" right="2.0" top="2.0" />
</padding>
<font>
<Font name="System Bold" size="14.0" />
</font>
</Label>
<Label text="结果反馈:" GridPane.rowIndex="2">
<Label prefWidth="75.0" text="结果反馈:" GridPane.rowIndex="2">
<padding>
<Insets bottom="2.0" left="2.0" right="2.0" top="2.0" />
</padding>
@ -57,7 +50,7 @@
<Insets left="5.0" />
</GridPane.margin>
</Label>
<TextField fx:id="loadDigitalOutcomes" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS">
<TextField fx:id="loadDigitalOutcomes" prefHeight="37.0" prefWidth="308.0" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS">
<GridPane.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</GridPane.margin>
@ -65,7 +58,7 @@
<Insets bottom="2.0" left="2.0" right="2.0" top="2.0" />
</padding>
</TextField>
<TextField fx:id="loadCompressedFile" GridPane.columnIndex="1" GridPane.rowIndex="1">
<TextField fx:id="loadCompressedFile" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.rowIndex="1">
<GridPane.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</GridPane.margin>
@ -81,7 +74,7 @@
<Insets bottom="2.0" left="2.0" right="2.0" top="2.0" />
</padding>
</TextArea>
<Button fx:id="selectLoadDigitalOutcomes7B" mnemonicParsing="false" onAction="#onSelectLD" text="选择文件" textAlignment="CENTER" GridPane.columnIndex="2" GridPane.halignment="CENTER" GridPane.valignment="CENTER">
<Button fx:id="selectLoadDigitalOutcomes7B" mnemonicParsing="false" onAction="#onSelectLD" text="选择文件" textAlignment="CENTER" GridPane.columnIndex="3" GridPane.halignment="CENTER" GridPane.valignment="CENTER">
<GridPane.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</GridPane.margin>
@ -92,7 +85,7 @@
<Font size="14.0" />
</font>
</Button>
<Button fx:id="generateHashFile7B" mnemonicParsing="false" onAction="#onGenerateHF" text="生成哈希值列表文件" GridPane.columnIndex="3" GridPane.halignment="CENTER" GridPane.valignment="CENTER">
<Button fx:id="selectLoadCompressedFile7B" mnemonicParsing="false" onAction="#onSelectLC" text="选择文件" GridPane.columnIndex="3" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER">
<GridPane.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</GridPane.margin>
@ -103,7 +96,7 @@
<Font size="14.0" />
</font>
</Button>
<Button fx:id="selectLoadCompressedFile7B" mnemonicParsing="false" onAction="#onSelectLC" text="选择文件" GridPane.columnIndex="2" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER">
<Button fx:id="caculateHash7B" mnemonicParsing="false" onAction="#onCaculateHash" text="计算哈希值" GridPane.columnIndex="4" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER">
<GridPane.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</GridPane.margin>
@ -114,7 +107,7 @@
<Font size="14.0" />
</font>
</Button>
<Button fx:id="caculateHash7B" mnemonicParsing="false" onAction="#onCaculateHash" text="计算哈希值" GridPane.columnIndex="3" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER">
<Button fx:id="generateHashFile7B" mnemonicParsing="false" onAction="#onGenerateHF" prefHeight="35.0" prefWidth="157.0" text="生成哈希值表文件" GridPane.columnIndex="4" GridPane.halignment="CENTER" GridPane.valignment="CENTER">
<GridPane.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</GridPane.margin>
@ -125,7 +118,7 @@
<Font size="14.0" />
</font>
</Button>
<TextArea editable="false" maxWidth="1.7976931348623157E308" prefWidth="400.0" text="1.对照《存储载体检查登记表》附件7检查并记录存储载体的类型/数量/内容/可读性情况&#10;2.计算数字化成果(包括单页、多页文件)的MD5码生成列表文件保存在目录所在文件夹&#10;3.将列表文件、目录文件、检测过程文件第2步生成的逻辑地址、物理地址等csv文件打包生成&quot;数字化验收检测包.rar&quot;&#10;4.计算并验证压缩包的MD5码或哈希值&#10;5.结果填入《存储载体检查登记表》附件7" wrapText="true" GridPane.columnIndex="3" GridPane.rowIndex="3">
<TextArea editable="false" maxWidth="1.7976931348623157E308" prefWidth="400.0" text="1.对照《存储载体检查登记表》附件7检查并记录存储载体的类型/数量/内容/可读性情况;&#10;&#10;2.计算数字化成果(包括单页、多页文件)的MD5码生成列表文件保存在目录所在文件夹&#10;&#10;3.将列表文件、目录文件、检测过程文件第2步生成的逻辑地址、物理地址等csv文件打包生成&quot;数字化验收检测包.rar&quot;;&#10;&#10;4.计算并验证压缩包的MD5码或哈希值;&#10;5.结果填入《存储载体检查登记表》附件7" wrapText="true" GridPane.columnIndex="3" GridPane.columnSpan="2" GridPane.rowIndex="3">
<GridPane.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</GridPane.margin>
@ -144,7 +137,7 @@
<Insets bottom="2.0" left="2.0" right="2.0" top="2.0" />
</padding>
</Label>
<Button fx:id="clearSelectedFoldersButton" mnemonicParsing="false" onAction="#onClearSelectedFolders" text="清除" GridPane.columnIndex="2">
<Button fx:id="clearSelectedFoldersButton" mnemonicParsing="false" onAction="#onClearSelectedFolders" text="清除" GridPane.columnIndex="2" GridPane.halignment="CENTER" GridPane.valignment="CENTER">
<font>
<Font size="14.0" />
</font>