From bd959825a3a77f3d7c1d23a840931b1f6ca6b1f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=AE=B6=E8=AE=AD?= Date: Sat, 1 Aug 2026 20:50:08 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E5=AF=BC=E5=87=BA=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E8=A1=A8=E6=A0=BC=E5=88=97=E5=AE=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/ui/history/ExportHistoryPane.java | 40 +++++++-- .../history/ExportHistoryPaneLayoutTest.java | 81 +++++++++++++++++++ 2 files changed, 113 insertions(+), 8 deletions(-) create mode 100644 src/test/java/com/example/workutils/system/ui/history/ExportHistoryPaneLayoutTest.java diff --git a/src/main/java/com/example/workutils/system/ui/history/ExportHistoryPane.java b/src/main/java/com/example/workutils/system/ui/history/ExportHistoryPane.java index 127c420..17e64ed 100644 --- a/src/main/java/com/example/workutils/system/ui/history/ExportHistoryPane.java +++ b/src/main/java/com/example/workutils/system/ui/history/ExportHistoryPane.java @@ -23,6 +23,13 @@ import java.util.function.Function; public final class ExportHistoryPane extends VBox { + private static final double ACTION_WIDTH = 150; + private static final double INDEX_WIDTH = 64; + private static final double QUERY_WIDTH = 140; + private static final double FILE_MIN_WIDTH = 220; + private static final double COUNT_WIDTH = 88; + private static final double TIME_WIDTH = 180; + private final TableView table = new TableView<>(); public ExportHistoryPane( @@ -64,12 +71,24 @@ public final class ExportHistoryPane extends VBox { null, fontSize)); table.getStyleClass().add("export-history-table"); - table.getColumns().add(actionColumn(commands, fontSize)); - table.getColumns().add(textColumn("序号", HistoryItem::index)); - table.getColumns().add(textColumn(queryColumnTitle, HistoryItem::query)); - table.getColumns().add(fileColumn()); - table.getColumns().add(textColumn(countColumnTitle, HistoryItem::count)); - table.getColumns().add(textColumn("时间", HistoryItem::timestamp)); + TableColumn actionColumn = actionColumn(commands, fontSize); + TableColumn indexColumn = textColumn("序号", HistoryItem::index); + TableColumn queryColumn = textColumn(queryColumnTitle, HistoryItem::query); + TableColumn fileColumn = fileColumn(); + TableColumn countColumn = textColumn(countColumnTitle, HistoryItem::count); + TableColumn timeColumn = textColumn("时间", HistoryItem::timestamp); + + fixWidth(actionColumn, ACTION_WIDTH); + fixWidth(indexColumn, INDEX_WIDTH); + fixWidth(queryColumn, QUERY_WIDTH); + fileColumn.setMinWidth(FILE_MIN_WIDTH); + fileColumn.setMaxWidth(Double.MAX_VALUE); + fileColumn.setResizable(true); + fixWidth(countColumn, COUNT_WIDTH); + fixWidth(timeColumn, TIME_WIDTH); + + table.getColumns().addAll( + actionColumn, indexColumn, queryColumn, fileColumn, countColumn, timeColumn); VBox.setVgrow(table, Priority.ALWAYS); getChildren().add(table); @@ -79,6 +98,13 @@ public final class ExportHistoryPane extends VBox { return table; } + private void fixWidth(TableColumn column, double width) { + column.setMinWidth(width); + column.setPrefWidth(width); + column.setMaxWidth(width); + column.setResizable(false); + } + private TableColumn textColumn( String title, Function value) { TableColumn column = new TableColumn<>(title); @@ -106,8 +132,6 @@ public final class ExportHistoryPane extends VBox { private TableColumn actionColumn( HistoryFileCommands commands, int fontSize) { TableColumn column = new TableColumn<>("操作"); - column.setPrefWidth(150); - column.setResizable(false); column.setCellFactory(ignored -> new TableCell<>() { private final Button open = StyledButton.small( "打开", Theme.base(fontSize - 1)); diff --git a/src/test/java/com/example/workutils/system/ui/history/ExportHistoryPaneLayoutTest.java b/src/test/java/com/example/workutils/system/ui/history/ExportHistoryPaneLayoutTest.java new file mode 100644 index 0000000..59127a5 --- /dev/null +++ b/src/test/java/com/example/workutils/system/ui/history/ExportHistoryPaneLayoutTest.java @@ -0,0 +1,81 @@ +package com.example.workutils.system.ui.history; + +import javafx.collections.FXCollections; +import javafx.scene.Scene; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableView; +import javafx.scene.layout.StackPane; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static com.example.workutils.system.ui.FxTestSupport.fx; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class ExportHistoryPaneLayoutTest { + + @Test + void usesSixSemanticColumnsWithOnlyTheFileColumnResizable() throws Exception { + fx(() -> { + ExportHistoryPane pane = pane(); + List> columns = List.copyOf(pane.table().getColumns()); + + assertEquals(List.of("操作", "序号", "导出格式", "生成文件", "文件数", "时间"), + columns.stream().map(TableColumn::getText).toList()); + assertEquals(6, columns.size()); + assertFixed(columns.get(0), 150); + assertFixed(columns.get(1), 64); + assertFixed(columns.get(2), 140); + assertTrue(columns.get(3).isResizable()); + assertEquals(220, columns.get(3).getMinWidth()); + assertFixed(columns.get(4), 88); + assertFixed(columns.get(5), 180); + }); + } + + @Test + void wideningTheTableGivesAllAdditionalSpaceToTheFileColumn() throws Exception { + fx(() -> { + ExportHistoryPane pane = pane(); + TableView table = pane.table(); + StackPane root = new StackPane(pane); + Scene scene = new Scene(root, 900, 420); + root.applyCss(); + root.layout(); + + List before = table.getColumns().stream() + .map(TableColumn::getWidth).toList(); + + scene.getWindow(); + root.resize(1200, 420); + root.applyCss(); + root.layout(); + + List after = table.getColumns().stream() + .map(TableColumn::getWidth).toList(); + for (int index : List.of(0, 1, 2, 4, 5)) { + assertEquals(before.get(index), after.get(index), 0.5); + } + assertTrue(after.get(3) > before.get(3) + 250, + "the file column must absorb the widened table space"); + }); + } + + private static ExportHistoryPane pane() { + HistoryFileCommands commands = new HistoryFileCommands( + ignored -> { }, ignored -> { }, ignored -> { }, ignored -> { }); + HistoryItem item = new HistoryItem( + "1", "HTML", "D:/exports/api-document.html", "1", "2026-07-31 20:06:30"); + return new ExportHistoryPane( + "导出格式", "文件数", FXCollections.observableArrayList(item), commands, 14); + } + + private static void assertFixed(TableColumn column, double width) { + assertFalse(column.isResizable()); + assertEquals(width, column.getMinWidth()); + assertEquals(width, column.getPrefWidth()); + assertEquals(width, column.getMaxWidth()); + } +}