Вы должны использовать комбинацию InputMap.put и ActionMap.put , чтобы захватывать события клавиатуры для компонентов, содержащихся в JScrollPane
, и обрабатывать события клавиатуры, когдаJScrollPane
имеет фокус.Так как значение приращения по умолчанию для прокрутки равно 1, вы должны добавить или вычесть желаемое значение приращения к текущему значению полосы прокрутки для JScrollPane
, которое вы можете получить с помощью JScrollPane.getVerticalScrollBar().getValue()
и установить с помощью JScrollPane.getVerticalScrollBar().setValue(int).
AnПример захвата событий для содержащихся элементов с помощью JScrollPane можно выполнить с помощью этого кода, я сделал это с помощью кнопок, но вы понимаете (извините за плохую организацию кода):
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Test
{
public static void main(String[] args)
{
final JFrame f = new JFrame("");
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(2000,1));
for(int i = 0; i != 2000; i++)
{
JButton btn = new JButton("Button 2");
panel.add(btn);
}
final JScrollPane sPane = new JScrollPane(panel);
final int increment = 5000;
sPane.getVerticalScrollBar().setUnitIncrement(increment);
KeyStroke kUp = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0);
KeyStroke kDown = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0);
sPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(kUp,"actionWhenKeyUp");
sPane.getActionMap().put("actionWhenKeyUp",
new AbstractAction("keyUpAction")
{
public void actionPerformed(ActionEvent e)
{
final JScrollBar bar = sPane.getVerticalScrollBar();
int currentValue = bar.getValue();
bar.setValue(currentValue - increment);
}
}
);
sPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(kDown,"actionWhenKeyDown");
sPane.getActionMap().put("actionWhenKeyDown",
new AbstractAction("keyDownAction")
{
public void actionPerformed(ActionEvent e)
{
final JScrollBar bar = sPane.getVerticalScrollBar();
int currentValue = bar.getValue();
bar.setValue(currentValue + increment);
}
}
);
f.add(sPane);
f.pack();
SwingUtilities.invokeLater(
new Runnable()
{
public void run()
{
f.setVisible(true);
}
}
);
}
}
Мызарегистрируйтесь, чтобы прослушать и обработать это событие с помощью:
sPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(kUp,"actionWhenKeyUp");
sPane.getActionMap().put("actionWhenKeyUp",
new AbstractAction("keyUpAction")
{
public void actionPerformed(ActionEvent e)
{
final JScrollBar bar = sPane.getVerticalScrollBar();
int currentValue = bar.getValue();
bar.setValue(currentValue - increment);
}
}
);
Код ключа, который выполняет приращение значения JScrollBar
, относится к абстрактному действию (в этом случае, когда пользователь нажимает клавишу вверх).
public void actionPerformed(ActionEvent e)
{
final JScrollBar bar = sPane.getVerticalScrollBar();
int currentValue = bar.getValue();
bar.setValue(currentValue - increment);
}
Что вы должны сделать, это завершить события, когда у вашего JScrollPane есть фокус, но это должно быть тривиально.
Надеюсь, это поможет спасти вашу жизнь: P или, по крайней мере, служить вамотправная точка.