所以,我在滚动窗格中有一堆文本域。当用户聚焦从底部开始的最后一个时,会添加更多的文本域。我的问题是,我如何让滚动窗格滚动到聚焦的文本域?我的意思是,用户将按TAB或ENTER键跳转到下一个文本域,但如果不滚动,他将无法看到它。我可以模拟在最后一个文本字段有焦点时按下下下箭头或PageDown,但那会很难看,即使它会做我需要做的事情。
我试过这样的东西,从我发现通过搜索,但我不能使它工作。
public void focusGained(FocusEvent e) {
currentview = t1;
int cons = i - 1;
Rectangle r = new Rectangle(t1.getX(), t1.getY(), 1, 1);
jScrollPane1.scrollRectToVisible(r);
if (t1.getName().equals("prod" + cons)) {
newproduct();
};
}
字符串
4条答案
按热度按时间ttygqcqt1#
请看FormScroller。它是一个简单的类,可以用来确保在使用Tab键切换到组件时组件是可见的。FormScroller可以与任何滚动窗格一起使用,并且不需要向表单上的每个组件添加FocusListener。
它提供了几个选项,允许您确实控制滚动的工作方式。
mzmfm0qo2#
有两件事。
首先,
JTextField#scrollRectToVisible
被覆盖了,做了一些与其他组件略有不同的事情......很烦人......其次,您需要转换字段相对于其父级的位置,然后使用父级的
scrollRectToVisible
方法,例如...30byixjq3#
我用一个自定义的焦点遍历策略解决了这个问题,它 Package 了容器的原始遍历策略,并在请求下一个或上一个组件时对滚动请求进行排队:
请注意,这依赖于现有行为,理论上将来可能会中断。
2vuwiymt4#
根据我之前的回答,一个更简单也可能更可靠的方法是定义一个自定义键盘焦点处理程序,每当组件接收到输入焦点时,管理器就会调度事件并将组件滚动到视图中:
焦点管理器可按如下方式安装: