2014-10-10 4 views
0

Итак, у меня есть 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()); 
      } 
     } 
    } 
} 
+2

Вы можете показать свой код, на который вы прикрепляете эти ActionListeners? – PeterK

+0

Я просто добавил весь код. – TheSabreSlicer

+0

Кроме того, при выборе файла у вас может быть фильтр, на котором вам разрешено выбирать только файлы (как я вижу, вы делаете некоторую проверку с файлами mp3 и wav-файлами). Я предлагаю также прочитать об этом немного больше. – user2494817

ответ

1

Вы должны добавить свои ActionListener с до ваших кнопок заставить их работать. Для добавления использовать этот код:

play.addActionListener(this); 
stop.addActionListener(this); 

в вашем public MusicMaker() конструктору.

В вашем MusicButton классе вы делаете это уже в этой строке:

this.addActionListener(this); 
+0

Спасибо! Я понял это. Я, должно быть, устал ... – TheSabreSlicer

0

Я только что понял мою проблему! Я не зарегистрировал ActionListener с помощью кнопок. Я устал ...: P Спасибо за попытку в любом случае.

Смежные вопросы