Итак, у меня есть 2 класса, основной класс и вторичный, который расширяет JButton и реализует ActionListener. Мой основной класс расширяет JFrame и реализует ActionListener. При нажатии любой из моих пользовательских кнопок вызывается ActionListener во вторичном вызове и выполняет свою функцию (чтобы открыть сборщик файлов).ActionListener не называется в основном классе?
Однако, когда я нажимаю кнопки, связанные с основным классом (кнопки, которые не являются моими обычными), ActionListener не вызывается.
Вот ActionListener код из основного класса:
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("ActionEvent MM");
String ac = e.getActionCommand();
if(ac.equalsIgnoreCase("play")){
pl.unPause();
}
if(ac.equalsIgnoreCase("stop")){
pl.pause();
}
}
А вот ActionListener код из пользовательского класса JButton:
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("ActionEvent MB");
int code = fc.showOpenDialog(this);
if (code == JFileChooser.APPROVE_OPTION) {
file = fc.getSelectedFile().getName();
if (file.substring(file.length() - 3).equalsIgnoreCase("mp3")
|| file.substring(file.length() - 3)
.equalsIgnoreCase("wav")) {
super.setText(file);
musicfile = new File(fc.getSelectedFile().getPath());
}
}
}
SYSOUT только для отладки.
EDIT: Весь код MusicMaker (основной) класс:
public class MusicMaker extends JFrame implements ActionListener{
public static Random gen = new Random();
public static Scanner kbr = new Scanner(System.in);
private JButton play = new JButton(new ImageIcon("play.png"));
private JButton stop = new JButton(new ImageIcon("stop.png"));
private JLabel BPML = new JLabel("BPM: ");
private SpinnerModel BPMsm = new SpinnerNumberModel(150, // initial value
1, // minimum
300, // max
1); // step
final private JSpinner BPMs = new JSpinner(BPMsm);
private ArrayList<MusicButton> mbtn = new ArrayList<MusicButton>();
public final CopyOnWriteArrayList<ArrayList<JCheckBox>> chbxsal = new CopyOnWriteArrayList<ArrayList<JCheckBox>>();
private final Object lock = new Object();
private Player pl = new Player();
public MusicMaker() {
super("Music Maker Beta v0.1");
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
for (int i = 0; i < 12; i++) {
mbtn.add(new MusicButton("choose" + i));
}
for (int i = 0; i < 16; i++) {
chbxsal.add(new ArrayList<JCheckBox>());
for (int e = 0; e < 12; e++) {
chbxsal.get(i).add(new JCheckBox());
}
}
this.getContentPane().setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 1;
this.add(play, gbc);
gbc.gridx = 1;
gbc.gridwidth = 1;
this.add(stop, gbc);
gbc.gridx = 4;
gbc.gridwidth = 3;
this.add(BPMs, gbc);
gbc.gridx = 2;
gbc.gridwidth = 3;
this.add(BPML, gbc);
gbc.gridwidth = 2;
for (int i = 0; i < 12; i++) {
gbc.gridx = 0;
gbc.gridy = i + 1;
this.add(mbtn.get(i), gbc);
}
gbc.gridwidth = 1;
for (int i = 0; i < 16; i++) {
for (int e = 0; e < 12; e++) {
gbc.gridx = i + 2;
gbc.gridy = e + 1;
this.add(chbxsal.get(i).get(e), gbc);
}
}
this.pack();
Thread thread = new Thread(pl);
thread.setName("Music player thread");
thread.setDaemon(true);
thread.start();
}
public static void main(String[] args) {
MusicMaker mm = new MusicMaker();
mm.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("ActionEvent MM");
String ac = e.getActionCommand();
if(ac.equalsIgnoreCase("play")){
pl.unPause();
}
if(ac.equalsIgnoreCase("stop")){
pl.pause();
}
}
private class Player implements Runnable {
private volatile boolean isPaused = true;
@Override
public void run() {
while (true) {
try {
while (isPaused) {
synchronized (lock) {
lock.wait();
}
}
System.out.println("test");
} catch (Exception e) {
// handle exceptions
}
}
}
public void pause() {
isPaused = true;
}
public void unPause() {
isPaused = false;
synchronized (lock) {
lock.notifyAll();
}
}
}
}
Весь код MusicButton (кнопка под заказ) Класс:
public class MusicButton extends JButton implements ActionListener {
public static Random gen = new Random();
public static Scanner kbr = new Scanner(System.in);
// Create a file chooser
final JFileChooser fc = new JFileChooser();
public String file = "";
public File musicfile;
public MusicButton(String s) {
super(s);
super.addActionListener(this);
super.setText("Choose");
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("ActionEvent MB");
int code = fc.showOpenDialog(this);
if (code == JFileChooser.APPROVE_OPTION) {
file = fc.getSelectedFile().getName();
if (file.substring(file.length() - 3).equalsIgnoreCase("mp3")
|| file.substring(file.length() - 3)
.equalsIgnoreCase("wav")) {
super.setText(file);
musicfile = new File(fc.getSelectedFile().getPath());
}
}
}
}
Вы можете показать свой код, на который вы прикрепляете эти ActionListeners? – PeterK
Я просто добавил весь код. – TheSabreSlicer
Кроме того, при выборе файла у вас может быть фильтр, на котором вам разрешено выбирать только файлы (как я вижу, вы делаете некоторую проверку с файлами mp3 и wav-файлами). Я предлагаю также прочитать об этом немного больше. – user2494817