gpt4 book ai didi

java - JButton 键监听器在按下其他键后不触发

转载 作者:行者123 更新时间:2023-11-29 08:45:04 24 4
gpt4 key购买 nike

我正在用 Java 创建一架虚拟钢琴。到目前为止,我有两个键的 Action 监听器,它们在大多数情况下都有效,只是不是一个接一个。例如,我在键盘上按下 q,它按下 c 键并播放 c,这是它应该做的。但是后来我想通过敲击键盘上的 w 来敲击钢琴上的 d 键,如果我已经按下了 q 键,它就不会这样做。

// c key
JButton btnC3 = new JButton("");
btnC3.addKeyListener(new KeyAdapter()
{
@Override
public void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent.VK_Q)
{
btnC3.doClick();
}
}
});
btnC3.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
// play c
try
{
keys.playNote(Notes.c3.getValue());
}
catch (InterruptedException e1)
{
e1.printStackTrace();
}
catch (InvalidMidiDataException e2)
{
e2.printStackTrace();
}
}
});
// d key
JButton btnD3 = new JButton("");
btnD3.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent.VK_W)
{
btnD3.doClick();
}
}
});
btnD3.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
// play d
try
{
keys.playNote(Notes.d3.getValue());
}
catch (InterruptedException e1)
{
e1.printStackTrace();
}
catch (InvalidMidiDataException e2)
{
e2.printStackTrace();
}
}
});
btnD3.setBackground(Color.WHITE);
btnD3.setBounds(wKeyWidth*1, 0, wKeyWidth, wKeyHeight);
frame.getContentPane().add(btnD3);

最佳答案

重点是问题。当按下 q 时它将起作用,因为该按钮具有焦点。无论您先按 q 还是按 w,它都不会起作用,因为“q”按钮始终具有焦点。您应该改用 KeyBindings。尽管任何组件有焦点,它们都能工作。

另一种解决方案是将 q 和 w 按钮按下添加到添加到 JFrame 的按键监听器中,并使用 requestFocus() 和 grabFocus()。

但您需要为 JFrame 中的按键监听器和按钮的按钮按下和释放添加实现。

这是一个完美的链接,可以了解焦点如何影响您的按键在 Swing 中的工作方式

http://www.javaworld.com/article/2076720/core-java/focus-on-swing.html

关于java - JButton 键监听器在按下其他键后不触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36962364/

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