2014-04-20 5 views
2

Я новичок на этом сайте и пытаюсь сделать 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

Вы просто хотите, когда вы нажимаете W, она будет играть? –

+0

Не только W, полный алфавит (код скважины еще не заполнен). – EiKei

+0

Следуйте соглашениям об именах Java. Имена переменных не должны начинаться с символа верхнего регистра. Не составляйте свои собственные соглашения об именах и учитесь на примерах в учебнике или учебнике. – camickr

ответ

1

Возможно, вместо этого вы захотите привязать ключи к области содержимого кадра, а не к кнопке. Вы можете использовать тот же 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(); 
      } 
     }); 
    } 
} 
+0

Спасибо! Все работает! : D – EiKei