0

I can't figure out how to call this class and make it execute. I am calling methods from other classes to make a menu to take it to different related tasks as lesson on Mexico, but I can't figure out how to make it display this class. in the different cases each call a method that executes it. i want to do this for the second program i posted. I want to make it execute th program so it can play its song

Main Class:

 import javax.swing.JOptionPane;
    public class MexicoProject 
    {
        public static void main(String[] args)
        {
            String[] choice = {"History", "Trivia", "Intro", "Anthem", "Quit"};
            String Menu;

            do
            {
                Menu = (String)JOptionPane.showInputDialog(null, "Welcome, this program will teach you about the history of Mexico.\nPick one of the options below.",
                    "Mexico History", JOptionPane.QUESTION_MESSAGE, null, choice, choice[0]);

                if (Menu == null)
                    JOptionPane.showMessageDialog(null, "Pick something!");
                else
                {
                    switch (Menu)
                    {
                        case "History":
                            MexicoHistory.History();
                            break;
                        case "Trivia":
                            Quiz();
                            break;
                        case "Intro":
                            FrenchIntro.Intro();
                            break;
                        case "Anthem":
                            {

                                break;
                            }
                            break;
     case "Quit":
                    JOptionPane.showMessageDialog(null, "Goodbye!");
                    break;
                default:
                    JOptionPane.showMessageDialog(null, "Something went wrong!  Try again!");
            }
        }   
    } while (Menu != "Quit");

}

Class Being Called:

import java.awt.event.*;
import java.io.*;
import javax.sound.sampled.*;

public class Song extends JFrame
{

AudioFormat audioFormat;
AudioInputStream audioInputStream;
SourceDataLine sourceDataLine;
boolean stopPlayback = false;
final JButton stopBtn = new JButton("Stop");
final JButton playBtn = new JButton("Play");
final JTextField textField = new JTextField("MexicanNationalAnthem.wav");

public static void main(String args[])
{
new Song();
}//end main
//-------------------------------------------//

public Song() //constructor
{

stopBtn.setEnabled(false);
playBtn.setEnabled(true);

//Instantiate and register action listeners
// on the Play and Stop buttons.
playBtn.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
stopBtn.setEnabled(true);
playBtn.setEnabled(false);
playAudio();//Play the file
}//end actionPerformed
}//end ActionListener
);//end addActionListener()

stopBtn.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
//Terminate playback before EOF
stopPlayback = true;
}//end actionPerformed
}//end ActionListener
);//end addActionListener()

getContentPane().add(playBtn,"West");
getContentPane().add(stopBtn,"East");
getContentPane().add(textField,"North");

setTitle("Himno Nacional Mexicano");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(250,70);
setVisible(true);
}//end constructor
//-------------------------------------------//

//This method plays back audio data from an
// audio file whose name is specified in the
// text field.
public void playAudio()
{
try
{
File soundFile = new File(textField.getText());
audioInputStream = AudioSystem.getAudioInputStream(soundFile);
audioFormat = audioInputStream.getFormat();
System.out.println(audioFormat);

DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class,audioFormat);

sourceDataLine =(SourceDataLine)AudioSystem.getLine(dataLineInfo);

//Create a thread to play back the data and
// start it running. It will run until the
// end of file, or the Stop button is
// clicked, whichever occurs first.
// Because of the data buffers involved,
// there will normally be a delay between
// the click on the Stop button and the
// actual termination of playback.

new PlayThread().start();//call the PlayThread class
}
catch (Exception e)
{
e.printStackTrace();
System.exit(0);
}//end catch
}//end playAudio

//=============================================//
//Inner class to play back the data from the
// audio file.
class PlayThread extends Thread
{
byte tempBuffer[] = new byte[10000];

public void run()
{
try
{
sourceDataLine.open(audioFormat);
sourceDataLine.start();

int cnt;
//Keep looping until the input read method
// returns -1 for empty stream or the
// user clicks the Stop button causing
// stopPlayback to switch from false to
// true.
while((cnt = audioInputStream.read(tempBuffer,0,tempBuffer.length)) != -1&& stopPlayback == false)
{
if(cnt > 0)
{
//Write data to the internal buffer of
// the data line where it will be
// delivered to the speaker.
sourceDataLine.write(tempBuffer, 0, cnt);
}//end if
}//end while
//Block and wait for internal buffer of the
// data line to empty.
sourceDataLine.drain();
sourceDataLine.close();

//Prepare to playback another file
stopBtn.setEnabled(false);
playBtn.setEnabled(true);
stopPlayback = false;
}
catch (Exception e)
{
e.printStackTrace();
System.exit(0);
}//end catch
}//end run
}//end inner class PlayThread
}//===================================//
  • Which method is the problem? You've posted a huge amount of code but not told us which lines are the issue. Also please format your code with indentation. – nickdos Mar 01 '14 at 06:16
  • in the different cases each call a method that executes it. i want to do this for the second program i posted. I want to make it execute th program so it can play its song – user3350704 Mar 01 '14 at 06:26

1 Answers1

0

Make sure that all the classes remain in same package.

You can call the method of other classes by creating a object for class being called ..

then use the object to call the method name..

 classbeingcalled obj= new classbeingcalled();
 obj.methodname();

or declare your method as a static method so you can call the method by using the class name

 public static returntype methodname(){
 ...
 }

from any class in the package

 classname.methodname();

PS: If you are not satisfied with this answer or dint expect this answer please be clear with your question.

practice2perfect
  • 499
  • 1
  • 4
  • 19
  • i used the first one and it say it cannot find obj.song. I tried the second one and got the same answer as before – user3350704 Mar 01 '14 at 07:58
  • what answer u got before.? i dont find anywhere ur previous answer and i think you are trying to call the constructor with the created object. if you want to call the constructor of the class. just use classname objname=new classname(); remember that class name and constructor name are the same – practice2perfect Mar 04 '14 at 13:19