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

问题描述 投票:10回答:5

我有一个带有大型面板的Swing应用,该面板包装在JScrollPane中。用户通常可以通过按Tab键在面板的子组件之间移动,因此当他们按Tab键切换到某个视图时,我希望滚动窗格自动滚动,以便具有输入焦点的组件始终可见。

我尝试使用KeyboardFocusManager监听输入焦点的变化,然后调用KeyboardFocusManager

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

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); } }); } } 的工作时间大约是一半。

是否有解决此问题的既定方法?如果有任何不同,则Swing应用程序基于Netbeans RCP构建(我们的大多数客户都运行Windows)。

我有一个带有大型面板的Swing应用程序,该应用程序包装在JScrollPane中。用户通常通过按Tab键在面板的子组件之间移动,因此当他们按Tab键移至某个视图时,我希望滚动...

java swing jscrollpane
5个回答
14
投票

我对其他答案的评论:


3
投票

例如,您也必须从scrollRectToVisible content.scrollRectToVisible(focused.getBounds()); 中提取Rectangle,然后进行比较


0
投票

您的代码中的一个主要问题是:


0
投票

这里jtextbox是您要关注的组件,而jscrollpane是您的滚动窗格:


0
投票

这里是我的简短摘要。将此添加到您的工具类:

© www.soinside.com 2019 - 2024. All rights reserved.