Question

I'm new in this site, and trying to make Drumpad/Launchpad/DrumMachine(still no specific name yet), and I have 26 buttons with 26 different sounds, and I want to bind buttons to keyboard, and I think I did it, but the problem is, keyboard button doesn't work until I click on button, and after clicking another button, previous button doesn't works from keyboard, anyone can help with solving it?

Here's my code for now:

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;
}

and also, I used WindowBuilder to create this.

Was it helpful?

Solution

Yo may instead want to bind the keys to the content pane of the frame, instead of the button. You can use the same Action for both the button and key bind. See code below. I get the content pane

JPanel contentPane = (JPanel)frame.getContentPane();

And get the input and action map from that and use it for the key binds.

You can see more at How to Use Key Bindings and 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();
            }
        });
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top