gpt4 book ai didi

java - 如何使 JScrollPane 滚动以跟随输入焦点?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:51:41 24 4
gpt4 key购买 nike

我有一个带有大面板的 Swing 应用程序,它被包裹在 JScrollPane 中。用户通常通过 Tab 键在面板的子组件之间移动,所以当他们使用 Tab 键切换到 View 外时,我希望滚动 Pane 自动滚动,以便具有输入焦点的组件始终可见。

我试过使用 KeyboardFocusManager监听输入焦点变化,然后调用 scrollRectToVisible .

这是一个 SSCCE显示我当前的策略(只需复制/粘贴并运行!):

import java.awt.KeyboardFocusManager;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.*;

public class FollowFocus {

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {

public void run() {
final int ROWS = 100;
final JPanel content = new JPanel();
content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
content.add(new JLabel(
"Thanks for helping out. Use tab to move around."));
for (int i = 0; i < ROWS; i++) {
JTextField field = new JTextField("" + i);
field.setName("field#" + i);
content.add(field);
}

KeyboardFocusManager.getCurrentKeyboardFocusManager()
.addPropertyChangeListener("focusOwner",
new PropertyChangeListener() {

@Override
public void propertyChange(PropertyChangeEvent evt) {
if (!(evt.getNewValue() instanceof JComponent)) {
return;
}
JComponent focused = (JComponent) evt.getNewValue();
if (content.isAncestorOf(focused)) {
System.out.println("Scrolling to " + focused.getName());
focused.scrollRectToVisible(focused.getBounds());
}
}
});

JFrame window = new JFrame("Follow focus");
window.setContentPane(new JScrollPane(content));
window.setSize(200, 200);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setVisible(true);
}
});
}
}

如果您运行这个示例,您会发现它运行得不是很好。它确实收到焦点更改通知,但对 scrollRectToVisible 的调用似乎没有任何效果。在我的应用程序中(太复杂,无法在此处显示),scrollRectToVisible 在我切换到视口(viewport)之外的内容时大约有一半的时间工作。

有解决这个问题的既定方法吗?如果有什么区别的话,Swing 应用程序是基于 Netbeans RCP 构建的(我们的大多数客户运行的是 Windows)。

最佳答案

我对另一个答案的评论:

scrollRectToVisible on the component itself is the whole point of that method ;-) It's passed up the hierarchy until a parent doing the scroll is found

... 除非组件本身处理它 - 正如 JTextField 所做的那样:它被实现为水平滚动以使插入符号可见。出路是在字段的父级上调用该方法。

编辑

为了清楚起见,替换的行是

    content.scrollRectToVisible(focused.getBounds());

关于java - 如何使 JScrollPane 滚动以跟随输入焦点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8245328/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com