Приложение Battleship вылетает, если я запускаю его через главное меню после щелчка при запуске - PullRequest
2 голосов
/ 23 августа 2010

Я создаю игру на линкоре с 4 классами, используя сокеты. Компьютер, сообщение игрока и класс меню. Чтобы запустить игру, я запускаю компьютерный класс, который является сервером, затем я запускаю класс меню, который вызывает меню. Через меню я нажимаю кнопку Пуск, чтобы создать новый объект игрока, который выглядит следующим образом

public static void runPlayer()
{
    Player client = new Player();   //creates player
    client.createBoard();
    client.run();


}

это отлично работает без класса меню, если я запускаю компьютерный класс, а затем класс игрока, игра запускается успешно. Но когда я вызываю метод run player в меню, появляется окно, в котором ничего нет. Вот мой класс Menu

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EtchedBorder;
import sun.audio.*;

public class Menu  {
    private javax.swing.JLabel image;
    private static final int EXIT_ON_CLOSE = 0;
    JFrame frame = new JFrame();
    JPanel panel = new JPanel(new BorderLayout());
    JLabel statusbar = new JLabel(" Battleship");
    JLabel Battleship = new JLabel("          Battleship ");
    static AudioPlayer MGP = AudioPlayer.player;
    static AudioStream BGM;
    AudioData MD;

    static ContinuousAudioDataStream loop = null;
    public static void waiting (int n)
    {

        long t0, t1;

        t0 =  System.currentTimeMillis();

        do{
            t1 = System.currentTimeMillis();
        }
        while (t1 - t0 < n);
    }


    public Menu() 
    {

        frame.setTitle("Battleship");


        statusbar.setBorder(BorderFactory.createEtchedBorder(
                EtchedBorder.RAISED));
        Battleship.setBorder(BorderFactory.createEtchedBorder(
                EtchedBorder.RAISED));

        panel.setLayout(null);

        JButton start = new JButton("Start");
        start.setBounds(100, 660, 80, 25);


        JButton exit = new JButton("Exit");
        exit.setBounds(190, 660, 80, 25);

        JButton StopMusic = new JButton("Stop Music");
        StopMusic.setBounds(300, 660, 160, 25);

        JButton StartMusic = new JButton("Start Music");
        StartMusic.setBounds(470, 660, 160, 25);


        Battleship.setFont(new Font("Courier New", Font.ITALIC, 36));
        Battleship.setForeground(Color.BLACK);



        image = new javax.swing.JLabel();
        image.setIcon(new javax.swing.ImageIcon("./battleship2.jpg"));
        frame.add(image, BorderLayout.EAST);
        frame.pack();



        frame.add(start);
        frame.add(exit);
        frame.add(StopMusic);
        frame.add(StartMusic);


        frame.add(panel);
        frame.add(statusbar, BorderLayout.SOUTH);
        frame.add(Battleship, BorderLayout.NORTH );



        frame.setSize(700, 800);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setVisible(true);

        music();



        start.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent e)
            {

                {                           
                        frame.dispose();                //closes frame
                        stopMusic();                    //stops music
                        //waiting(500);
                        runPlayer();





            }}
         });
        StopMusic.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent e)
            {

                {                           
                    stopMusic();

                }
            }
         });
        StartMusic.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent e)
            {

                {                           
                    startMusic();

                }
            }
         });

       exit.addActionListener(new ActionListener() 
       {
        public void actionPerformed(ActionEvent e)
        {

            System.out.println( "Ending Game" );
            System.exit(0);
        }
     });}




    public static void music() 
    {       
        try
        {
            InputStream test = new FileInputStream("./battle.wav");
            BGM = new AudioStream(test);
            AudioPlayer.player.start(BGM);




        }
        catch(FileNotFoundException e){
            System.out.print(e.toString());
        }
        catch(IOException error)
        {
            System.out.print(error.toString());
        }
        MGP.start(loop);





    }
    public void stopMusic() 
    {
        if (BGM != null)
          AudioPlayer.player.stop(BGM);
        if (loop != null)
          AudioPlayer.player.stop(loop);
      }
    public void startMusic() {
        try
        {
            InputStream test = new FileInputStream("./battle.wav");
            BGM = new AudioStream(test);
            AudioPlayer.player.start(BGM);




        }
        catch(FileNotFoundException e){
            System.out.print(e.toString());
        }
        catch(IOException error)
        {
            System.out.print(error.toString());
        }
        MGP.start(loop);
      }
    public static void runPlayer()
    {
        Player client = new Player();   //creates player
        client.createBoard();
        client.run();


    }

    public static void main(String[] args) 
    {       
        new Menu();                       
    }
}

Я думаю, что моя проблема где-то в этом методе слушателя

start.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent e)
            {

                {                           
                        frame.dispose();                //closes frame
                        stopMusic();                    //stops music
                        //waiting(500);
                        runPlayer();





            }}
         });

Ответы [ 2 ]

2 голосов
/ 23 августа 2010

Сложно ответить на этот вопрос с предоставленной информацией. Но мне нужно будет угадать, что делает метод runPlayer (). Я предполагаю, что есть некоторый тип цикла while, который не позволяет Thread Dispatch Thread обновить новый созданный вами JFrame.

Попробуйте поместить stopMusic () и runPlayer () в новый поток.

В основном как-то так

start.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e) {
    frame.dispose(); // closes frame

    new Thread(){
      public void run(){
        stopMusic(); // stops music
        runPlayer();
      }
    }.start();
  }
}); 
1 голос
/ 23 августа 2010

Я думаю, что проблема лежит за пределами кода, который вы показали; это может быть что угодно: от отсутствующей setVisible() до проблемы синхронизации . FWIW, у меня есть несколько замечаний по поводу кода:

  1. Создайте свой графический интерфейс на EDT , @David Young только что предложил.

  2. Используйте статические константы, чтобы не повторяться.

  3. Не используйте пробелы для форматирования меток; используйте JLabel константы выравнивания.

  4. Вместо нулевого макета используйте вложенные макеты, чтобы получить желаемый результат.

  5. Чтобы не вызывать публичный метод в конструкторе, вы продублировали код startMusic(). Вместо этого вызовите его после , когда конструктор завершит работу.

Вот пример:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EtchedBorder;
import sun.audio.*;

public class Menu {

    private static final String TITLE = "Battleship";
    private static final String SOUND_FILE = "./battle.wav";
    private javax.swing.JLabel image;
    JFrame frame = new JFrame(TITLE);
    JPanel center = new JPanel(new BorderLayout());
    JLabel statusbar = new JLabel(TITLE);
    JLabel battleship = new JLabel(TITLE, JLabel.CENTER);
    static AudioPlayer MGP = AudioPlayer.player;
    static AudioStream BGM;
    static ContinuousAudioDataStream loop = null;
    AudioData MD;

    public Menu() {

        frame.setTitle("Battleship");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        statusbar.setBorder(BorderFactory.createEtchedBorder(
            EtchedBorder.RAISED));
        battleship.setBorder(BorderFactory.createEtchedBorder(
            EtchedBorder.RAISED));

        JButton start = new JButton("Start");
        JButton exit = new JButton("Exit");
        JButton StopMusic = new JButton("Stop Music");
        JButton StartMusic = new JButton("Start Music");

        battleship.setFont(new Font("Courier New", Font.ITALIC, 36));
        battleship.setForeground(Color.BLACK);

        image = new JLabel();
        image.setHorizontalAlignment(JLabel.CENTER);
        image.setIcon(new ImageIcon("./battleship2.jpg"));
        center.add(image, BorderLayout.CENTER);

        JPanel panel = new JPanel();
        panel.add(start);
        panel.add(exit);
        panel.add(StopMusic);
        panel.add(StartMusic);
        center.add(panel, BorderLayout.SOUTH);

        frame.add(battleship, BorderLayout.NORTH);
        frame.add(center, BorderLayout.CENTER);
        frame.add(statusbar, BorderLayout.SOUTH);

        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        start.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                //frame.dispose();
                stopMusic();
                runPlayer();
            }
        });
        StopMusic.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                stopMusic();
            }
        });
        StartMusic.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                startMusic();
            }
        });

        exit.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                System.out.println("Ending Game");
                System.exit(0);
            }
        });
    }

    public void stopMusic() {
        if (BGM != null) {
            AudioPlayer.player.stop(BGM);
        }
        if (loop != null) {
            AudioPlayer.player.stop(loop);
        }
    }

    public void startMusic() {
        try {
            InputStream test = new FileInputStream(SOUND_FILE);
            BGM = new AudioStream(test);
            AudioPlayer.player.start(BGM);
            MGP.start(loop);
        } catch (FileNotFoundException e) {
            System.out.print(e.toString());
        } catch (IOException error) {
            System.out.print(error.toString());
        }
    }

    public static void runPlayer() {
        Player client = new Player();
        client.createBoard();
        client.run();
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                Menu menu = new Menu();
                menu.startMusic();
            }
        });
    }

    // stub for missing class
    private static class Player {
        void createBoard() {}
        void run() {}
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...