From a20dffa7a0ef7c41116be2ed4a04837f50763e12 Mon Sep 17 00:00:00 2001 From: abel533 Date: Sat, 4 Apr 2026 18:35:10 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=94=B9=E8=BF=9B=E6=BB=9A=E5=8A=A8=20m?= =?UTF-8?q?axOffset=20=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 使用 totalItems - visibleLines 替代 totalItems - 1 避免滚动到只剩1行内容的极端情况 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/main/java/com/claudecode/tui/ClaudeCodeComponent.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/claudecode/tui/ClaudeCodeComponent.java b/src/main/java/com/claudecode/tui/ClaudeCodeComponent.java index e7c7894..ff27e5d 100644 --- a/src/main/java/com/claudecode/tui/ClaudeCodeComponent.java +++ b/src/main/java/com/claudecode/tui/ClaudeCodeComponent.java @@ -95,6 +95,7 @@ public class ClaudeCodeComponent extends Component /** 最近一次渲染的总行数(用于滚动限制) */ private volatile int lastRenderedItemCount = 0; + private volatile int lastMaxVisibleLines = 20; /** 首次用户输入回调(用于 conversation summary) */ private Consumer onFirstUserInput; @@ -287,8 +288,9 @@ public class ClaudeCodeComponent extends Component )); } - // 记录总行数(供 scroll() 使用) + // 记录总行数和可见行数(供 scroll() 使用) lastRenderedItemCount = allItems.size(); + lastMaxVisibleLines = maxLines; // 虚拟滚动 List visibleItems; @@ -992,7 +994,9 @@ public class ClaudeCodeComponent extends Component private void scroll(TuiState s, int delta) { int totalItems = lastRenderedItemCount; - int maxOffset = Math.max(0, totalItems - 1); + int visibleLines = lastMaxVisibleLines; + // 最大偏移 = 超出可见范围的行数 + int maxOffset = Math.max(0, totalItems - visibleLines); int newOffset = Math.max(0, Math.min(s.scrollOffset + delta, maxOffset)); setState(new TuiState(s.inputText, s.messages, newOffset, s.thinking, s.thinkingText)); }