当前位置: 首页 > 面试题库 >

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

华知
2023-03-14
问题内容

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

我尝试使用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当我进入视口之外的内容时,其工作时间大约只有一半。

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


问题答案:

我对其他答案的评论:

该方法的重点在于组件本身上的scrollRectToVisible ;-)它沿层次结构向上传递,直到找到进行滚动的父级为止

…除非组件本身对其进行处理-就像JTextField一样:实现了水平滚动以使插入符号可见。出路是在字段的父级上调用方法。

编辑

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

    content.scrollRectToVisible(focused.getBounds());


 类似资料:
  • 我在我的squarespace站点上使用了一些HTML&CSS来创建一个自定义的跟随光标。我只想有一个浮动的圆圈,没有实际的光标显示。我已经得到了它的工作,但当我的网站滚动跟随光标没有移动的页面滚动,只是卡在顶部。 这只会导致follow光标完全停止随鼠标移动而移动,在页面中心变成静态的。 将HTML&CSS注入到squarespace站点以创建自定义跟随光标: null null

  • 跟随页面滚动非常的简单,就是设置元素的top值即可,代码量只有20行。 1.准备 HTML <div class="roll"> </div> 2.准备css 一定要记得把动画个加上 body{ min-height: 4000px; } .roll{ position: relati

  • 本文向大家介绍bootstrap监听滚动实现头部跟随滚动,包括了bootstrap监听滚动实现头部跟随滚动的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了bootstrap监听滚动头部跟随滚动的实现方法,供大家参考,具体内容如下 实现案例 css控制样式 js监听 导入js 知识只有共享才能传播,才能推崇出新的知识,才能学到更多,这里写的每一篇文字/博客,基本都是从网上查询了一下资料

  • 我有一个类可以画一些非常简单的图形,比如直线、圆和矩形。线条可以动态扩展,有时当它们扩展到超出分辨率时,如果没有滚动条,就无法看到。因此,我已经将JScrollPane添加到JFrame中,但不幸的是,尽管已经调用了布局管理器,但滚动条还是无法滚动。 这是我所拥有的:-一个绘制组件(线条、矩形、圆形)的类-一个设置JFrame/JScrollPane的类 这是我的GUI类的摘录代码: 通过上面的代

  • 我有一个JScrollPane,它的内容窗格是一个JXList。当我在列表上使用鼠标滚轮时,列表一次执行三(3)项。这也适用于表,无论行高如何。我如何改变这一点,使-无论平台-列表和表的滚动距离正好是1项?设置块增量不会削减它,因为表中的某些行具有不同的高度。

  • 问题内容: 我正在尝试实现一个非常简单的用例,UI功能,其中: 有一个带有一些内容的标签 如果单击,则将文本输入替换为可用标签的内容 用户可以编辑内容 按下回车键时,输入将隐藏并且标签将返回具有更新内容的内容 我最终可以完全正确(实际上是使用MongoBD后端,redux等),而我唯一做不到的事情(花了一整天的时间在Google上搜索和阅读SOF类似的帖子)是: 当我的文字输入出现时,我无法将焦点