我在JScrollPane中有一个JPanel。 JPanel垂直包含多个JTextAreas。
每当刷新页面时,我都希望将滚动窗格的滚动保持在顶部。 目前,滚动始终从底部开始。
这是我目前的代码,它不起作用..
panel.invalidate();
panel.revalidate();
panel.repaint();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
((JPanel) panel).setLocation(new Point(0, 0));
}
});
我也尝试将下面的代码添加到滚动窗格,但它不起作用..
scrollPanel.getViewport().setViewPosition( new Point(0, 0) );
我查看了其他stackoverflow问题,他们在Jscrollpane中使用Jtextarea(他们使用setCaretPosition(0)解决了它,但是我不能对面板使用相同的功能)。就我而言,还有一个额外的层。
我该如何解决这个问题??
编辑**
根据Pavlo Viazovskyy的建议,我也在下面尝试了这个,它仍然不适合我.. :(
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
scrollPane.getVerticalScrollBar().setValue(0);
}
});
答案 0 :(得分:3)
非常感谢您的所有评论。 对不起,我没有在问题中提供一个完整的例子,因为涉及的课程太多了。
在我的情况下,在ScrollPane里面的Panel里面的textareas,我默认使用setViewPosition方法在invokelater方法中使用scrollPane将滚动设置到顶部。
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
scrollPane.getViewport().setViewPosition( new Point(0, 0) );
}
});
答案 1 :(得分:2)
如果您无法直接访问JScrollPane
,则只需使用JComponent#scrollRectToVisible
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class ScrollTest {
public static void main(String[] args) {
new ScrollTest();
}
public ScrollTest() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("Test");
frame.add(new JScrollPane(new BigPane()));
frame.setSize(200, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class BigPane extends JPanel {
public BigPane() {
setLayout(new BorderLayout());
JButton scroll = new JButton("Scroll to top");
add(scroll, BorderLayout.SOUTH);
scroll.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
scrollRectToVisible(new Rectangle(0, 0, 1, 1));
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
}
}
是的,您可以遍历组件层次结构,直到找到JViewport
,但此方法适合您。
请记住,Rectangle
是相对于调用该方法的组件,因此如果我使用JButton
代替它,它会尝试使JButton
可见,而不是面板