问题描述
所以我问了一个以前的问题,这是对它的跟进,我认为它应该有自己的问题。我有这个代码,其中 JScrollPane 中存在特定大小的 JPanel。问题是,我想将自己的最大值设置为 JScrollPane 的滚动条,这很容易使用 bar.setMaximum(value)
方法。但是,当我不使用鼠标本身而是使用 W、A、S、D 键滚动条时,会出现一个奇怪的问题。
问题是我将滚动条设置为新的最大值,并进行了更改侦听器以更新滚动条的最大值(因为如果您查看我之前的问题,滚动条值将返回到它们的默认最大大小而不是我设置的那些)。我以为我解决了上一个问题的问题,但现在滚动条不会一直滚动,并在某个点停止。有什么办法可以解决这个问题?
注意:我不想更改滚动窗格中存在的 JPanel 大小,我只想在使用 W、A、S、D 键左右移动时使滚动时间更长。 (我的单位增量是 1,这对我来说太大了,所以改变滚动条的最大大小似乎很合适,因为这会减少增量的整体大小)
这是最小的可重现(我在 JPanel map
中画了一个矩形以帮助查看发生了什么):
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.changelistener;
import java.awt.event.*;
import java.awt.*;
public class Test implements KeyListener,changelistener {
private static JScrollPane view;
public test() {
create();
}
public static void main(String[] args) {
new test();
}
public void create() {
JFrame frame = new JFrame(); //make frame
frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(1000,1000);
frame.setLocationRelativeto(null);
frame.setResizable(false);
SpringLayout layout = new SpringLayout();
JPanel base = new JPanel();
base.setPreferredSize(new Dimension(1000,1000));
base.setLayout(layout);
JPanel map = new JPanel() {
public void paint(Graphics g) {
super.paint(g);
g.drawRect(0,995,100);
}
};
map.setPreferredSize(new Dimension(1000,1000));
view = new JScrollPane(map);
view.setFocusable(true);
view.addKeyListener(this);
view.setPreferredSize(new Dimension(300,300));
layout.putConstraint(SpringLayout.HORIZONTAL_CENTER,view,SpringLayout.HORIZONTAL_CENTER,base);
layout.putConstraint(SpringLayout.VERTICAL_CENTER,SpringLayout.VERTICAL_CENTER,base);
base.add(view); //add scrollpane to base jpanel
frame.add(base);
frame.setVisible(true);
JScrollBar hBar = view.getHorizontalScrollBar();
JScrollBar vBar = view.getVerticalScrollBar();
hBar.getModel().addchangelistener(this);
vBar.getModel().addchangelistener(this);
hBar.getModel().setMaximum(10*800);
vBar.getModel().setMaximum(10*800);
}
public void stateChanged(ChangeEvent event) { //change max whenever model's max tries to default
BoundedRangeModel model = (BoundedRangeModel) event.getSource();
model.setMaximum(10*800);
}
public void keypressed(KeyEvent event) { //W,A,S,D keys to change values of jscrollbars
int verticalValue = view.getVerticalScrollBar().getModel().getValue();
int horizontalValue = view.getHorizontalScrollBar().getModel().getValue();
switch (event.getKeyCode()) {
case KeyEvent.VK_W:
view.getVerticalScrollBar().getModel().setValue(verticalValue - 10);
break;
case KeyEvent.VK_S:
view.getVerticalScrollBar().getModel().setValue(verticalValue + 10);
break;
case KeyEvent.VK_A:
view.getHorizontalScrollBar().getModel().setValue(horizontalValue - 10);
break;
case KeyEvent.VK_D:
view.getHorizontalScrollBar().getModel().setValue(horizontalValue + 10);
break;
}
}
@Override
public void keyTyped(KeyEvent e) {
// Todo Auto-generated method stub
}
@Override
public void keyreleased(KeyEvent e) {
// Todo Auto-generated method stub
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)