JScrollPane 自动向下滚动到 JPanel 中的最低组件
JScrollPane automagically scrolls down to lowest component in JPanel
在我的 JPanel(位于 JScrollPane 中)中,我有几个 JTextArea。启动程序时,这些区域会填充 JTextArea.setText("text");
问题是 JScrollPane 向下滚动到 Y 位置最低的 JTextArea,就好像用户会把焦点放在 JTextArea 上一样,无论它何时填充文本。我认为如果 JScrollPane 可能想要滚动到正在使用的 "current" JTextArea,我可以通过首先在底部填充 JTextArea 来解决这个问题。它没有用,所以我假设它只记得它的最低点,然后出于某种原因停留在那里。
像这样设置视图没有任何区别。
JScrollPane.getViewPort().scrollRectToVisible(new Rectangle(0,0,1,1));
我通过忽略填充最后一个 JTextAreas 进行了测试,然后 JScrollPane 正在查看 JPanel 的顶部,如我所愿。
发生了什么,为什么忽略我的代码?
更新,选择答案
当 GUI 准备就绪时,您必须稍后设置视口
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
scrollPane.getViewport().setViewPosition(new Point(0, 0));
}
});
JScrollPane.getViewPort().scrollRectToVisible(new Rectangle(0,0,1,1));
scrollRectToVisible() 方法旨在用于添加到视口的组件(包含文本区域的面板),而不是视口本身。不确定在视口上直接调用它时会发生什么。
相反,我会执行以下操作:
scrollPane.getViewPort().setViewPosition( new Point(0, 0) );
请注意,您可能需要将该语句包装在 SwingUtilities.invokeLater() 中,以确保在布局管理器将所有组件放置在面板上之后,代码在 EDT 上执行。
在我的 JPanel(位于 JScrollPane 中)中,我有几个 JTextArea。启动程序时,这些区域会填充 JTextArea.setText("text");
问题是 JScrollPane 向下滚动到 Y 位置最低的 JTextArea,就好像用户会把焦点放在 JTextArea 上一样,无论它何时填充文本。我认为如果 JScrollPane 可能想要滚动到正在使用的 "current" JTextArea,我可以通过首先在底部填充 JTextArea 来解决这个问题。它没有用,所以我假设它只记得它的最低点,然后出于某种原因停留在那里。
像这样设置视图没有任何区别。
JScrollPane.getViewPort().scrollRectToVisible(new Rectangle(0,0,1,1));
我通过忽略填充最后一个 JTextAreas 进行了测试,然后 JScrollPane 正在查看 JPanel 的顶部,如我所愿。 发生了什么,为什么忽略我的代码?
更新,选择答案 当 GUI 准备就绪时,您必须稍后设置视口
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
scrollPane.getViewport().setViewPosition(new Point(0, 0));
}
});
JScrollPane.getViewPort().scrollRectToVisible(new Rectangle(0,0,1,1));
scrollRectToVisible() 方法旨在用于添加到视口的组件(包含文本区域的面板),而不是视口本身。不确定在视口上直接调用它时会发生什么。
相反,我会执行以下操作:
scrollPane.getViewPort().setViewPosition( new Point(0, 0) );
请注意,您可能需要将该语句包装在 SwingUtilities.invokeLater() 中,以确保在布局管理器将所有组件放置在面板上之后,代码在 EDT 上执行。