gpt4 book ai didi

java - 为什么 JScrollBar 与可编辑组件共存时不响应箭头键击?

转载 作者:行者123 更新时间:2023-12-03 05:05:34 26 4
gpt4 key购买 nike

(经过描述,代码中的事情就清楚了)

我有一个程序,其中包含 JScrollBar、JTextArea、JTextFields、JButtons 和其他一些东西。 (我只添加了SSCCE代码)

好的,我为 JScrollBar 的左右 JButton 添加了键绑定(bind),我使用 getInputMapgetActionMap 来实现这一点。

如果我的 GUI 程序中有 JScrollBar,但没有 JTextField 或 JTextArea 等可编辑组件,则 keyStrokes KeyEvent.VK_LEFTKeyEvent.VK_RIGHT 将正常工作(如预计)

但是,如果我有一个带有 JScrollBar 的可编辑组件,那么它不会响应 KeyEvent.VK_LEFTKeyEvent.VK_RIGHT (不是预期的)为什么会发生这种情况!?
更奇怪的事情是,如果我选择不同的 keyStrokes 来绑定(bind),例如左键 KeyEvent.VK_S 和右键 KeyEvent.VK_F ,它将工作!!现在为什么?

如何修复,如何在可编辑组件共存时为 JScrollBar JButton 进行左右箭头的按键绑定(bind)?

这是两个 SSCCE 风格的工作代码。第一个包含没有可编辑组件的 JScrollBar,第二个包含带有 JTextArea 的 JScrollBar。

第一个可以正常工作,它将响应键盘的左右箭头。 (它不包含可编辑组件)

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ScrollTest extends JPanel
{

JPanel panel;
JScrollBar scrollBar;
JButton sliderLeftButton;
JButton sliderRightButton;

public ScrollTest()
{
scrollBar = new JScrollBar(JScrollBar.HORIZONTAL, 0, 6, 0, 300);

sliderLeftButton = (JButton) scrollBar.getAccessibleContext().getAccessibleChild(1);
sliderLeftButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "leftmove");
sliderLeftButton.getActionMap().put("leftmove", leftmove);

sliderRightButton = (JButton) scrollBar.getAccessibleContext().getAccessibleChild(0);
sliderRightButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "rightmove");
sliderRightButton.getActionMap().put("rightmove", rightMove);

panel = new JPanel(new GridLayout(2, 0));
panel.add(scrollBar);

this.setLayout(new BorderLayout());
this.add(panel, BorderLayout.NORTH);
}
AbstractAction leftmove = new AbstractAction()
{
@Override
public void actionPerformed(ActionEvent ae)
{
int increment = scrollBar.getBlockIncrement();
int current = scrollBar.getValue();
current -= increment;
scrollBar.setValue(current);
System.out.println("left");
}
};
AbstractAction rightMove = new AbstractAction()
{
@Override
public void actionPerformed(ActionEvent ae)
{
int increment = scrollBar.getBlockIncrement();
int current = scrollBar.getValue();
current += increment;
scrollBar.setValue(current);
System.out.println("right");
}
};

private static void createAndShowGUI()
{
JFrame frame;
frame = new JFrame("Scroll Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(880, 100);
frame.add(new ScrollTest(), BorderLayout.CENTER);
frame.setVisible(true);
}

public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
UIManager.put("swing.boldMetal", Boolean.FALSE);
createAndShowGUI();
}
});
}
}

第二个将工作,即它不会响应键盘的左右箭头。 (它确实包含可编辑组件 - 一个 JTextArea)

更奇怪的事情
KeyEvent.VK_LEFT 替换为 KeyEvent.VK_S,并将 KeyEvent.VK_RIGHT 替换为 KeyEvent.VK_F。现在,S 适用于左侧,F 适用于右侧!为什么它不能使用左右箭头。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ScrollTest extends JPanel
{

JPanel panel;
JPanel panel2;
JScrollBar scrollBar;
JButton sliderLeftButton;
JButton sliderRightButton;

public ScrollTest()
{
scrollBar = new JScrollBar(JScrollBar.HORIZONTAL, 0, 6, 0, 300);

sliderLeftButton = (JButton) scrollBar.getAccessibleContext().getAccessibleChild(1);
sliderLeftButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "leftmove");
sliderLeftButton.getActionMap().put("leftmove", leftmove);

sliderRightButton = (JButton) scrollBar.getAccessibleContext().getAccessibleChild(0);
sliderRightButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "rightmove");
sliderRightButton.getActionMap().put("rightmove", rightMove);

panel = new JPanel(new GridLayout(2, 0));
panel.add(scrollBar);

panel2 = new JPanel(new GridLayout(1, 0));
panel2.add(new JTextArea(50, 10));

this.setLayout(new BorderLayout());
this.add(panel, BorderLayout.NORTH);
this.add(panel2, BorderLayout.SOUTH);
}
AbstractAction leftmove = new AbstractAction()
{
@Override
public void actionPerformed(ActionEvent ae)
{
int increment = scrollBar.getBlockIncrement();
int current = scrollBar.getValue();
current -= increment;
scrollBar.setValue(current);
System.out.println("left");
}
};
AbstractAction rightMove = new AbstractAction()
{
@Override
public void actionPerformed(ActionEvent ae)
{
int increment = scrollBar.getBlockIncrement();
int current = scrollBar.getValue();
current += increment;
scrollBar.setValue(current);
System.out.println("right");
}
};

private static void createAndShowGUI()
{
JFrame frame;
frame = new JFrame("Scroll Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(880, 100);
frame.add(new ScrollTest(), BorderLayout.CENTER);
frame.setVisible(true);
}

public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
UIManager.put("swing.boldMetal", Boolean.FALSE);
createAndShowGUI();
}
});
}
}

最佳答案

这是因为 JTextArea 正在窃取您的击键:

    textPane.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "pressed RIGHT");
textPane.getActionMap().put("pressed RIGHT", rightMove);

看看BasicTextUI.installKeyboardActions()

关于java - 为什么 JScrollBar 与可编辑组件共存时不响应箭头键击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18619367/

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