• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

JAVA - metoda klasy A wywołana w klasie B - problem

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
158 wizyt
pytanie zadane 12 września 2018 w Java przez Stalowy69 Użytkownik (510 p.)
edycja 12 września 2018 przez Stalowy69
package MusicApp;
import javax.sound.midi.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

 class TworzGui implements MetaEventListener{
     public JPanel panelGlowny;
     public ArrayList<JCheckBox> listaWyboru;
     public Sequencer sekwenser;
     public Sequence sekwencja;
     public Track sciezka;
     public JFrame ramkaGlowna;

     String[] nazwyInstrumentow = {"Bass drum","Closed Hi-Hat", "Open Hi-Hat","Acoustic Snare", "Crash Cymbal", "Hand Clap",
            "High Tom", "Hi Bongo", "Maracas", "Whistle", "Low Conga", "Cowbell", "Vibraslap",
            "Low-mid Tom", "High Agogo", "Open Hi Conga"};

     int[] instrumenty = {45,42,46,38,49,39,50,60,70,72,64,56,58,47,67,63};

     
     public void tworzGui(){

        ramkaGlowna = new JFrame("MusicApp");
        ramkaGlowna.setDefaultCloseOperation(3);
        JPanel panel = new JPanel(new BorderLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(15 ,15,15 ,15));
	
	listaWyboru = new ArrayList<JCheckBox>();

        Box obszarPrzyciskow = new Box(BoxLayout.Y_AXIS);

        JButton start = new JButton("Start");
        start.addActionListener(new MojStartListener());
        obszarPrzyciskow.add(start);

        JButton stop = new JButton("stop");
        stop.addActionListener(new MojStopListener());
        obszarPrzyciskow.add(stop);

        JButton tempoG = new JButton("Szybciej");
        tempoG.addActionListener(new MojTempoGListener());
        obszarPrzyciskow.add(tempoG);

        JButton tempoD = new JButton("Wolniej");
        tempoD.addActionListener(new MojTempoDlistener());
        obszarPrzyciskow.add(tempoD);

        Box obszarNazw = new Box(BoxLayout.Y_AXIS);
        for(int i=0;i<16;i++){
            obszarNazw.add(new Label(nazwyInstrumentow[i]));
        }

        panel.add(BorderLayout.EAST, obszarPrzyciskow);
        panel.add(BorderLayout.WEST, obszarNazw);

        ramkaGlowna.getContentPane().add(panel);

        GridLayout siatkaPolWyboru = new GridLayout(16,16);
        siatkaPolWyboru.setVgap(1);
        siatkaPolWyboru.setHgap(2);
        panelGlowny = new JPanel(siatkaPolWyboru);
        panel.add(BorderLayout.CENTER, panelGlowny);

         for(int w=0;w<256;w++){
                JCheckBox c = new JCheckBox();
                c.setSelected(false);
                listaWyboru.add(c);
                panelGlowny.add(c);

        ramkaGlowna.setBounds(50,50,300,300);
        ramkaGlowna.pack();
        ramkaGlowna.setVisible(true);


    }

    public void utworzSciezkeiOdtworz() throws Exception {
        midiInit();
        int[] listaSciezki = new int[16];

        sekwencja.deleteTrack(sciezka);
        sciezka = sekwencja.createTrack();

        for(int i=0;i<16;i++){

            int klucz = instrumenty[i];
            for(int j=0;j<16;j++){
                JCheckBox jc = listaWyboru.get(j+(16*i));
                if(jc.isSelected()){
                    listaSciezki[j] = klucz;
                }else{
                    listaSciezki[j] = 0;
                }
            }
            utworzSciezke(listaSciezki);
            sciezka.add(tworzZdarzenie(176,1,127,0,16));
        }

        sciezka.add(tworzZdarzenie(176,1,127,0,16));

        try{
            sekwenser.setSequence(sekwencja);
            sekwenser.setLoopCount(sekwenser.LOOP_CONTINUOUSLY);
            sekwenser.start();
            sekwenser.setTempoInBPM(120);
        } catch (InvalidMidiDataException e) {
            e.printStackTrace();
        }
    }


    public void utworzSciezke(int[] lista){
        for(int i=0;i<16;i++){
            int klucz = lista[i];
            if(klucz!=0){
                sciezka.add(tworzZdarzenie(144,9,klucz,100,i));
                sciezka.add(tworzZdarzenie(128,9,klucz,100,i+1));
            }
        }
    }

    public MidiEvent tworzZdarzenie(int plc , int kanal, int jeden, int dwa, int takt) {
        MidiEvent zdarzenie = null;
        try{
            ShortMessage sMessage = new ShortMessage();
            sMessage.setMessage(plc, kanal, jeden, dwa);
            zdarzenie = new MidiEvent(sMessage, takt);
        }catch (Exception e) {e.printStackTrace();}
        return zdarzenie;
    }

    @Override
    public void meta(MetaMessage meta) {

    }

    void midiInit() {

        try {
            sekwenser = MidiSystem.getSequencer();
            sekwenser.open();
            sekwencja = new Sequence(Sequence.PPQ, 4);
            sciezka = sekwencja.createTrack();
            sekwenser.setTempoInBPM(120);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 

package MusicApp;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MojStartListener implements ActionListener {

    TworzGui gui = new TworzGui();
    @Override
    public void actionPerformed(ActionEvent e) {
         try {
            gui.utworzSciezkeiOdtworz();
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }
}
package MusicApp;

public class MusicApp {
    public static void main(String[] args)  {
        TworzGui Gui = new TworzGui();
        Gui.tworzGui();


    }
}

 

Kiedy mam klasę słuchacza w tej samej klasie to wszystko działa lecz chciałem klasę słuchacza umieścić po prostu w osobnej klasie. I tu pojawił mi się problem.

Action Listener po kliknięciu przycisku się wywołuje i wyskakuje wyjątek. Pe po zdebugowaniu programu mam puste listy (listaWyboru) i wyskakują wyjątki NullPointerException.

Naprawiłem listę wyboru tak że w klasie MusicApp dodałem deklarację domyślnego konstruktora i zadeklarowałem w niej listaWyboru

public TworzGui() {
         listaWyboru = new ArrayList<JCheckBox>();
         for(int w=0;w<256;w++){
             JCheckBox c = new JCheckBox();
             c.setSelected(false);
             listaWyboru.add(c);
             panelGlowny.add(c);
         }

Potem aplikacja niby przebiegła bez wyjątków ale nie mam żadnego dźwięku.

Jakby znowu problem z sequencerem był

1 odpowiedź

+1 głos
odpowiedź 12 września 2018 przez mbabane Szeryf (79,280 p.)
wybrane 12 września 2018 przez Stalowy69
 
Najlepsza

Z tego co widzę to w MojStartListner masz całkiem inny obiekt niż w metodzie main. Musisz w jakiś sposob przekazać do obiektu słuchacza własiciwy obiekt, czyli ten ktory tworzysz w main.

Np. tak:

package MusicApp;
 
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
public class MojStartListener implements ActionListener {
 
    TworzGui gui;

    public MojStartListener(TworzGui gui)
    {
           this.gui = gui;
     }

    @Override
    public void actionPerformed(ActionEvent e) {
         try {
            gui.utworzSciezkeiOdtworz();
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }

Teraz możesz przekazać właściwy obiekt tak:

MojStartListener mstl = new MojStartListener( this );

start.addActionListener( mstl );

 

1
komentarz 12 września 2018 przez Stalowy69 Użytkownik (510 p.)
Dziękuję za pomoc.

Oczywiście zadziałało :D

Podobne pytania

0 głosów
0 odpowiedzi 100 wizyt
pytanie zadane 3 grudnia 2015 w Java przez gab123 Mądrala (5,230 p.)
0 głosów
1 odpowiedź 99 wizyt
0 głosów
1 odpowiedź 294 wizyt
pytanie zadane 26 października 2017 w Java przez zygmunt Początkujący (310 p.)

91,787 zapytań

140,452 odpowiedzi

316,849 komentarzy

61,135 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...