gpt4 book ai didi

java - JScrollPane中的JPanel,如何防止自动滚动

转载 作者:行者123 更新时间:2023-12-02 13:44:47 24 4
gpt4 key购买 nike

我在使用 JScrollPane 时遇到自动滚动问题。例如,在下面的代码中,如果我们更改 Spinner 的值,则所有 TextAreas 的值都会更改。然后 JScrollPane 自动滚动到最新更改的 JComponent。

我可以阻止这种自动滚动吗?

有人指出这个问题是“重复的”,但根本不是。这个问题Java / Swing : JTextArea in a JScrollPane, how to prevent auto-scroll?是一个JScrollPane中的JTextArea,所以我们可以使用DefaultCaret来解决这个问题,因为JTextArea有DefaultCaret。但在我的问题中,它是 JScrollPane 中的 JPanel,JPanel 没有 DefaultCaret。所以我们不能用同样的方式来解决这个问题。

import java.awt.BorderLayout

import javafx.scene.layout.Pane;

import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTextArea;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class ScrollControl {
static JFrame main_frame = new JFrame();
static JScrollPane scroll_pane = new JScrollPane();
static JPanel pane = new JPanel();
static JSpinner spinner = new JSpinner();
static JTextArea text1 = new JTextArea();
static JTextArea text2 = new JTextArea();
static JTextArea text3 = new JTextArea();
static JTextArea text4 = new JTextArea();
static JTextArea text5 = new JTextArea();
static JTextArea text6 = new JTextArea();
static JTextArea text7 = new JTextArea();

public static void main(String args[]){
main_frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));
spinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent arg0) {
text1.setText(spinner.getValue().toString());
text2.setText(spinner.getValue().toString());
text3.setText(spinner.getValue().toString());
text4.setText(spinner.getValue().toString());
text5.setText(spinner.getValue().toString());
text6.setText(spinner.getValue().toString());
text7.setText(spinner.getValue().toString());
}
});
pane.add(spinner);
pane.add(text1);
pane.add(text2);
pane.add(text3);
pane.add(text4);
pane.add(text5);
pane.add(text6);
pane.add(text7);
scroll_pane = new JScrollPane(pane);
main_frame.setSize(300, 100);
main_frame.getContentPane().add(scroll_pane, BorderLayout.CENTER);

main_frame.setVisible(true);
}
}

最佳答案

我不知道如何防止滚动,但您可以将滚动条重置回其原始位置:

spinner.addChangeListener(new ChangeListener()
{
@Override
public void stateChanged(ChangeEvent arg0)
{
final JScrollBar vertical = scroll_pane.getVerticalScrollBar();
final int value = vertical.getValue();

text1.setText(spinner.getValue().toString());
text2.setText(spinner.getValue().toString());
text3.setText(spinner.getValue().toString());
text4.setText(spinner.getValue().toString());
text5.setText(spinner.getValue().toString());
text6.setText(spinner.getValue().toString());
text7.setText(spinner.getValue().toString());

SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
vertical.setValue( value );
}
});
}
});

invokeLater() 会将代码添加到事件调度线程的末尾,因此它将在所有自动滚动发生后执行,因此看起来滚动条从未移动过。

关于java - JScrollPane中的JPanel,如何防止自动滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25105623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com