如果没有这个组件(和另一个)有焦点,就没有办法滚动一个可滚动的 Swing 组件吗?
然后一般的解决方案是使用Key Bindings。
但是,问题是每个组件都可以为 up/down 事件实现 Key Bindings 本身,在这种情况下,Action
调用该组件的相关项。
本教程演示了如何从组件中删除键绑定。
一个 JTable 和一些文本框
所以这些是实现向上/向下键绑定的组件示例。
JButton 控件
是没有默认向上/向下键绑定的组件示例。
因此,您可以添加自己的代码,如下所示:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class SSCCE extends JPanel
{
public SSCCE()
{
setLayout( new BorderLayout() );
JPanel top = new JPanel();
top.add( new JTextField(10) );
top.add( new JButton("Button") );
add(top, BorderLayout.PAGE_START);
JLabel label = new JLabel( new ImageIcon("mong.jpg") );
JScrollPane scrollPane = new JScrollPane( label );
add(scrollPane, BorderLayout.CENTER);
JScrollBar scrollBar = scrollPane.getVerticalScrollBar();
InputMap im = getInputMap(JScrollBar.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
ActionMap am = getActionMap();
im.put(KeyStroke.getKeyStroke("pressed UP"), "up");
am.put("up", new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
scrollBar.setValue(scrollBar.getValue() - scrollBar.getUnitIncrement(-1));
}
});
im.put(KeyStroke.getKeyStroke("pressed DOWN"), "down");
am.put("down", new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
scrollBar.setValue(scrollBar.getValue() + scrollBar.getUnitIncrement(1));
}
});
}
private static void createAndShowGUI()
{
JFrame frame = new JFrame("SSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new SSCCE());
frame.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationByPlatform( true );
frame.setVisible( true );
}
public static void main(String[] args) throws Exception
{
java.awt.EventQueue.invokeLater( () -> createAndShowGUI() );
}
}
在上面的示例中,当焦点位于按钮上而不是文本字段时,图像将滚动。