如何使按钮彼此分开工作

时间:2014-04-20 11:02:29

标签: java arrays swing jbutton adt

我是这个网站的新手,并尝试制作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来创建它。

1 个答案:

答案 0 :(得分:1)

Yo可能希望将键绑定到框架的内容窗格,而不是按钮。您可以对按钮和键绑定使用相同的Action。见下面的代码。我得到了内容窗格

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

从中获取输入和动作映射,并将其用于键绑定。

您可以在How to Use Key BindingsHow 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();
            }
        });
    }
}