• 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

Object Storage Arubacloud
0 głosów
181 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 111 wizyt
pytanie zadane 3 grudnia 2015 w Java przez gab123 Mądrala (5,230 p.)
0 głosów
1 odpowiedź 110 wizyt
0 głosów
1 odpowiedź 315 wizyt
pytanie zadane 26 października 2017 w Java przez zygmunt Początkujący (310 p.)

92,563 zapytań

141,413 odpowiedzi

319,590 komentarzy

61,948 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...