gpt4 book ai didi

java - 如何使按钮彼此分开工作

转载 作者:行者123 更新时间:2023-11-30 11:19:31 33 4
gpt4 key购买 nike

我是这个网站的新手,正在尝试制作 Drumpad/Launchpad/DrumMachine(还没有具体名称),我有 26 个按钮和 26 种不同的声音,我想将按钮绑定(bind)到键盘,我想我做到了,但问题是,在我单击按钮之前,键盘按钮不起作用,单击另一个按钮后,上一个按钮在键盘上不起作用,有人可以帮助解决这个问题吗?

这是我现在的代码:

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 来创建它。

最佳答案

您可能想要将键绑定(bind)到框架的内容 Pane ,而不是按钮。您可以对按钮和按键绑定(bind)使用相同的 Action。请参阅下面的代码。我得到了内容面板

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

并从中获取输入和操作映射并将其用于键绑定(bind)。

您可以在 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();
}
});
}
}

关于java - 如何使按钮彼此分开工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23181288/

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