Java 如何使jscrollpane从头到尾滚动?
我正在尝试使jscorllpane从开始到结束自动滚动。我对verticalbar使用设置值方法,但它不起作用。如何使其滚动? 这是我的代码:当我运行这段代码时,它只是跳转到jscorllpane的末尾,而不是一步一步地搜索Java 如何使jscrollpane从头到尾滚动?,java,jscrollpane,Java,Jscrollpane,我正在尝试使jscorllpane从开始到结束自动滚动。我对verticalbar使用设置值方法,但它不起作用。如何使其滚动? 这是我的代码:当我运行这段代码时,它只是跳转到jscorllpane的末尾,而不是一步一步地搜索 import java.awt.event.*; import javax.swing.*; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; impor
import java.awt.event.*;
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
class JScrollPaneToTopAction implements ActionListener {
JScrollPane scrollPane;
public JScrollPaneToTopAction(JScrollPane scrollPane) {
if (scrollPane == null) {
throw new IllegalArgumentException("JScrollPaneToTopAction: null JScrollPane");
}
this.scrollPane = scrollPane;
}
public void actionPerformed(ActionEvent actionEvent) {
run();
}
public void run() {
JScrollBar verticalBar = scrollPane.getVerticalScrollBar();
int i = verticalBar.getMinimum();
while (i < verticalBar.getMaximum()) {
verticalBar.setValue(verticalBar.getMinimum()+i);
i += 50;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
scrollPane.getParent().invalidate();
scrollPane.repaint();
scrollPane.invalidate();
System.out.println("changing " + i);
}
}
}
public class Draft20 {
public static void main(String args[]) {
JFrame frame = new JFrame("Tabbed Pane Sample");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTextArea tr = new JTextArea();
JLabel label = new JLabel("Label");
label.setPreferredSize(new Dimension(1000, 1000));
JScrollPane jScrollPane = new JScrollPane(label);
JButton bn = new JButton("Move");
bn.addActionListener(new JScrollPaneToTopAction(jScrollPane));
frame.add(bn, BorderLayout.SOUTH);
frame.add(jScrollPane, BorderLayout.CENTER);
frame.setSize(400, 150);
frame.setVisible(true);
}
}
导入java.awt.event.*;
导入javax.swing.*;
导入java.awt.BorderLayout;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
类JSCRollPaneToopAction实现ActionListener{
JScrollPane滚动窗格;
公共JScrollPaneToTopAction(JScrollPane滚动窗格){
如果(滚动窗格==null){
抛出新的IllegalArgumentException(“JScrollPaneTopAction:null JScrollPane”);
}
this.scrollPane=滚动窗格;
}
已执行的公共无效操作(ActionEvent ActionEvent){
run();
}
公开募捐{
JScrollBar verticalBar=scrollPane.getVerticalScrollBar();
int i=verticalBar.getMinimum();
而(i
我认为问题在于您对重新绘制的调用排队等待EDT计算,但EDT正忙于执行您的actionPerformed。EDT将仅在run()完成后执行重新绘制请求。这就是为什么你只能看到最后的结果
我不确定我能不能说清楚。。。检查此代码,它适用于我:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
class JScrollPaneToTopAction implements ActionListener, Runnable {
JScrollPane scrollPane;
public JScrollPaneToTopAction(JScrollPane scrollPane) {
if (scrollPane == null) {
throw new IllegalArgumentException("JScrollPaneToTopAction: null JScrollPane");
}
this.scrollPane = scrollPane;
}
@Override
public void actionPerformed(ActionEvent actionEvent) {
new Thread(this).start();
}
@Override
public void run() {
JScrollBar verticalBar = scrollPane.getVerticalScrollBar();
int i = verticalBar.getMinimum();
while (i < verticalBar.getMaximum()) {
verticalBar.setValue(verticalBar.getMinimum() + i);
i += 50;
try {
Thread.sleep(100);
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
scrollPane.getParent().invalidate();
scrollPane.repaint();
scrollPane.invalidate();
}
});
System.out.println("changing " + i);
}
}
}
public class Draft20 {
public static void main(String args[]) {
JFrame frame = new JFrame("Tabbed Pane Sample");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTextArea tr = new JTextArea();
JLabel label = new JLabel("Label");
label.setPreferredSize(new Dimension(1000, 1000));
JScrollPane jScrollPane = new JScrollPane(label);
JButton bn = new JButton("Move");
bn.addActionListener(new JScrollPaneToTopAction(jScrollPane));
frame.add(bn, BorderLayout.SOUTH);
frame.add(jScrollPane, BorderLayout.CENTER);
frame.setSize(400, 150);
frame.setVisible(true);
}
}
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JScrollBar;
导入javax.swing.JScrollPane;
导入javax.swing.JTextArea;
导入javax.swing.SwingUtilities;
类JSCRollPaneToopAction实现ActionListener,Runnable{
JScrollPane滚动窗格;
公共JScrollPaneToTopAction(JScrollPane滚动窗格){
如果(滚动窗格==null){
抛出新的IllegalArgumentException(“JScrollPaneTopAction:null JScrollPane”);
}
this.scrollPane=滚动窗格;
}
@凌驾
已执行的公共无效操作(ActionEvent ActionEvent){
新线程(this.start();
}
@凌驾
公开募捐{
JScrollBar verticalBar=scrollPane.getVerticalScrollBar();
int i=verticalBar.getMinimum();
而(i
我希望它能有所帮助。第一次运行循环时,它会将滚动条值设置为
2*verticalBar.getMinimum()
。这是故意的吗?也不要在事件侦听器中执行长操作(尤其是使用线程.sleep
)的任何操作!改用新线程。如果最小值不等于0,则应跳转。此外,如果最大值小于50,它也将直接跳到末尾。欢迎:-)如果此答案解决了您的问题,您可以将其标记为正确,以便其他人将从中受益,他们可能也有相同的问题。很高兴知道这有帮助:-)