我是这个网站的新手,并尝试制作Drumpad / Launchpad / DrumMachine(还没有特定名称),我有26个按钮,有26种不同的声音,我想将按钮绑定到键盘,我想我做到了,但问题是,键盘按钮不起作用,直到我点击按钮,点击另一个按钮后,前一个按钮无法通过键盘工作,任何人都可以帮忙解决它?
这是我现在的代码:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
public class DrumPad extends JFrame implements ActionListener, KeyListener{
public static JComponent component;
ArrayList<File> f = new ArrayList<File>();
Buttons bEx, btnButton_1;
File wavFile = new File("loopbase\\loop1");
File[] allfiles = wavFile.listFiles();
ArrayList<AudioClip> sounds = new ArrayList<AudioClip>();
AudioClip sound;
JComboBox comboBox;
public static void main (String [] args) throws Exception{
DrumPad game=new DrumPad();
game.setVisible(true);
game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public DrumPad() throws Exception {
try{sound = Applet.newAudioClip(wavFile.toURL());}
catch(Exception e){e.printStackTrace();}
for(File i:allfiles){
sounds.add(Applet.newAudioClip(i.toURL()));
}
setResizable(false);
setSize(700,300);
setTitle("Test");
setContentPane(new JLabel(new ImageIcon("image.jpg")));
getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
JPanel Menu = new JPanel();
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation(dim.width/2-this.getSize().width/2, dim.height/2-this.getSize().height/2);
Menu.setAlignmentX(Component.LEFT_ALIGNMENT);
FlowLayout fl_Menu = (FlowLayout) Menu.getLayout();
fl_Menu.setAlignment(FlowLayout.LEFT);
fl_Menu.setVgap(20);
fl_Menu.setHgap(50);
Menu.setSize(new Dimension(200, 200));
getContentPane().add(Menu);
JLabel lblMakingUpThe = new JLabel("Test");
Menu.add(lblMakingUpThe);
JSlider slider = new JSlider();
Menu.add(slider);
slider.setOpaque(false);
JPanel ButtonsArea = new JPanel();
ButtonsArea.setOpaque(false);
Menu.setOpaque(false);
getContentPane().add(ButtonsArea);
Buttons btnButton = new Buttons("Button1");
ButtonsArea.setLayout(new GridLayout(3, 5, 5, 3));
ButtonsArea.add(btnButton);
Buttons btnButton_1 = new Buttons("Button2");
ButtonsArea.add(btnButton_1);
btnButton_1.getInputMap().put(KeyStroke.getKeyStroke("W"),"play");
btnButton_1.getActionMap().put("play", play);
Buttons btnButton_2 = new Buttons("button3");
ButtonsArea.add(btnButton_2);
Buttons btnButton_3 = new Buttons("button4");
ButtonsArea.add(btnButton_3);
Buttons btnButton_4 = new Buttons("button5");
ButtonsArea.add(btnButton_4);
Buttons btnButton_5 = new Buttons("button6");
ButtonsArea.add(btnButton_5);
Buttons btnButton_6 = new Buttons("button7");
ButtonsArea.add(btnButton_6);
Buttons btnButton_7 = new Buttons("button8");
ButtonsArea.add(btnButton_7);
Buttons btnButton_8 = new Buttons("button9");
ButtonsArea.add(btnButton_8);
Buttons btnButton_9 = new Buttons("button10");
ButtonsArea.add(btnButton_9);
Buttons btnButton_10 = new Buttons("button11");
ButtonsArea.add(btnButton_10);
Buttons btnButton_11 = new Buttons("button12");
ButtonsArea.add(btnButton_11);
Buttons btnButton_12 = new Buttons("button13");
ButtonsArea.add(btnButton_12);
Buttons btnButton_13 = new Buttons("button14");
ButtonsArea.add(btnButton_13);
Buttons btnButton_14 = new Buttons("button15");
ButtonsArea.add(btnButton_14);
Buttons btnButton_15 = new Buttons("button16");
ButtonsArea.add(btnButton_15);
Buttons btnButton_16 = new Buttons("button15");
ButtonsArea.add(btnButton_16);
Buttons btnButton_17 = new Buttons("button18");
ButtonsArea.add(btnButton_17);
JButton btnButton_18 = new JButton("button19");
ButtonsArea.add(btnButton_18);
JButton btnButton_19 = new JButton("button20");
ButtonsArea.add(btnButton_19);
JButton btnButton_20 = new JButton("button21");
ButtonsArea.add(btnButton_20);
JPanel Functions = new JPanel();
getContentPane().add(Functions);
Functions.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
JComboBox comboBox = new JComboBox();
comboBox.setModel(new DefaultComboBoxModel(new String[] {"Test", "Techno", "Beats"}));
Functions.add(comboBox);
Functions.setOpaque(false);
JToggleButton tglbtnSoundsOff = new JToggleButton("Sounds OFF");
Functions.add(tglbtnSoundsOff);
for(int i=0;i<sounds.size();i++){
Buttons j = (Buttons) ButtonsArea.getComponent(i);
j.clip=sounds.get(i);
j.addActionListener(this);
}
}
Action play = new AbstractAction(){
public void actionPerformed(ActionEvent e) {
if(e.getSource().getClass()==Buttons.class)((Buttons)e.getSource()).clip.play();
}
};
public void actionPerformed(ActionEvent ae){
if(ae.getSource().getClass()==Buttons.class)((Buttons)ae.getSource()).clip.play();
}
public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
//System.out.println("keyPressed="+KeyEvent.getKeyText(e.getKeyCode()));
}
public void keyReleased(KeyEvent e) {
//System.out.println("keyReleased="+KeyEvent.getKeyText(e.getKeyCode()));
}
}
class Buttons extends JButton{
public Buttons() {
super();
// TODO Auto-generated constructor stub
}
public Buttons(Action a) {
super(a);
// TODO Auto-generated constructor stub
}
public Buttons(Icon icon) {
super(icon);
// TODO Auto-generated constructor stub
}
public Buttons(String text, Icon icon) {
super(text, icon);
// TODO Auto-generated constructor stub
}
public Buttons(String text) {
super(text);
// TODO Auto-generated constructor stub
}
public AudioClip clip;
}
而且,我使用WindowBuilder来创建它。
答案 0 :(得分:1)
Yo可能希望将键绑定到框架的内容窗格,而不是按钮。您可以对按钮和键绑定使用相同的Action
。见下面的代码。我得到了内容窗格
JPanel contentPane = (JPanel)frame.getContentPane();
从中获取输入和动作映射,并将其用于键绑定。
您可以在How to Use Key Bindings和How to Use Actions
查看更多内容import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
public class TestKeyBind {
public TestKeyBind() {
JButton playButton = new JButton(play);
JButton stopButton = new JButton(stop);
JFrame frame = new JFrame();
JPanel contentPane = (JPanel)frame.getContentPane();
InputMap im = contentPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
ActionMap am = contentPane.getActionMap();
im.put(KeyStroke.getKeyStroke("P"), "play");
am.put("play", play);
im.put(KeyStroke.getKeyStroke("S"), "stop");
am.put("stop", stop);
frame.setLayout(new GridBagLayout());
frame.add(playButton);
frame.add(stopButton);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
Action play = new AbstractAction("Play") {
public void actionPerformed(ActionEvent e) {
System.out.println("Play");
}
};
Action stop = new AbstractAction("Stop") {
public void actionPerformed(ActionEvent e) {
System.out.println("Stop");
}
};
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run() {
new TestKeyBind();
}
});
}
}