如何设置滚动到顶部 - Jscrollpane 中有多个 JTextarea 的 JPanel
How to set scroll to the top - JPanel that has multiple JTextareas inside Jscrollpane
我在 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) );
我研究了其他 Whosebug 问题,他们在 Jscrollpane 中使用了 Jtextarea(他们使用 setCaretPosition(0) 解决了这个问题,但是我不能对面板使用相同的功能)。就我而言,还有一个额外的层。
我该如何解决这个..?
编辑**
根据 Pavlo Viazovskyy 的建议,我也在下面尝试了这个,但它仍然对我不起作用..:(
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
scrollPane.getVerticalScrollBar().setValue(0);
}
});
非常感谢您的所有评论。
抱歉,我没有在问题中给出完整的适当示例,因为涉及的不同 类 太多了..
在我的例子中,在 ScrollPane 内的 Panel 内的 textareas,我通过在 invokelater 方法中使用 setViewPosition 方法滚动到 scrollPane 默认情况下滚动到顶部。
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
scrollPane.getViewport().setViewPosition( new Point(0, 0) );
}
});
当您无法直接访问 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
可见,不是面板
我在 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) );
我研究了其他 Whosebug 问题,他们在 Jscrollpane 中使用了 Jtextarea(他们使用 setCaretPosition(0) 解决了这个问题,但是我不能对面板使用相同的功能)。就我而言,还有一个额外的层。
我该如何解决这个..?
编辑**
根据 Pavlo Viazovskyy 的建议,我也在下面尝试了这个,但它仍然对我不起作用..:(
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
scrollPane.getVerticalScrollBar().setValue(0);
}
});
非常感谢您的所有评论。 抱歉,我没有在问题中给出完整的适当示例,因为涉及的不同 类 太多了..
在我的例子中,在 ScrollPane 内的 Panel 内的 textareas,我通过在 invokelater 方法中使用 setViewPosition 方法滚动到 scrollPane 默认情况下滚动到顶部。
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
scrollPane.getViewport().setViewPosition( new Point(0, 0) );
}
});
当您无法直接访问 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
可见,不是面板