Java JScrollBar 不会一直滚动

问题描述

所以我问了一个以前的问题,这是对它的跟进,我认为它应该有自己的问题。我有这个代码,其中 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...