Java exe не будет отображать конкретный jframe, но IDE будет - PullRequest
0 голосов
/ 11 июля 2019

Я создал мини-игру викторины в java и хотел преобразовать ее в exe .. К ней прикреплены фотографии и звуки, но они находятся в соответствующих папках и с правильными путями.Когда я нажимаю «Вставить новый вопрос», exe работает нормально, то же самое происходит и с опцией «exit».Но когда я нажимаю «Воспроизвести», окно не появляется, но я также не получаю сообщение об ошибке ..

Я попытался поместить фотографии и звуки в ту же папку, что и класс, который их использует, но это не удалосьрешить проблему.Я также попытался вставить ".." в начале пути URL, но это также не помогло.Я прикрепил код для не показанного фрейма.

ArrayList<Question> questions;
    int selectedQuestion = 0;
    int remainingLife = 3;
    Random random = new Random();
    int fillAnswer = 0;    
    String [] answerArray = new String[4];

Clip clipSuccess;
Clip clipFailure;
Clip clipGameOver;

public static Mixer mixer;
public static Clip clip;

javax.swing.Timer timer = new javax.swing.Timer(1000, new java.awt.event.ActionListener() {
    @Override
    public void actionPerformed(ActionEvent arg0) {                      

         timer.stop();
         jLabel5.setIcon(null);
         playRound();

    }
});


public PlayGame() {
    initComponents();
    questions = new ArrayList<Question>();
    populateArrayList();
    clipSuccess = setSound("../Sounds/success.wav");
    clipFailure = setSound("../Sounds/failure.wav");
    clipGameOver = setSound("../Sounds/gameOver.wav");
    playRound(); 

   }

public void populateArrayList(){

    try{
       FileInputStream file = new FileInputStream("Questions.dat"); 
       ObjectInputStream inputFile = new ObjectInputStream(file);

       boolean endOfFile = false;

       while(!endOfFile){

           try{

               questions.add((Question) inputFile.readObject());                   
           }
           catch(EOFException e){
               endOfFile = true;
           }
           catch(Exception f){
               JOptionPane.showMessageDialog(null, f.getMessage());
           }
       }
       inputFile.close();

    }
    catch(IOException e){

        JOptionPane.showMessageDialog(null, e.getMessage());
    }
}

public Clip setSound(String soundPath){
    Mixer.Info[] mixInfos = AudioSystem.getMixerInfo();
    /*for(Mixer.Info info: mixInfos){
        System.out.println(info.getName() + "----" + info.getDescription());
    }*/
    mixer = AudioSystem.getMixer(mixInfos[3]);

    DataLine.Info dataInfo = new DataLine.Info(Clip.class, null);
    try {
        clip = (Clip)mixer.getLine(dataInfo);
                }
    catch(LineUnavailableException lue){
        lue.printStackTrace();            
    }

    try{
        URL soundURL = PlayGame.class.getResource(soundPath);
        AudioInputStream audioStream = AudioSystem.getAudioInputStream(soundURL);
        clip.open(audioStream);
    }
    catch(LineUnavailableException lue){
        lue.printStackTrace();
    }
    catch(UnsupportedAudioFileException uofe){
        uofe.printStackTrace();
    }
    catch(IOException ioe){
        ioe.printStackTrace();
    }
    return clip;
}



public void successAnswer(){
    JOptionPane.showMessageDialog(null, "Απάντησες σωστά!");
    jLabel5.setText("");
    jLabel5.setIcon(new ImageIcon(PlayGame.class.getResource("../Images/Fireworks-animated.gif")));
    clipSuccess.setFramePosition(0);
    clipSuccess.start();        
    timer.start();
}

 public void wrongAnswer(){ 

    remainingLife--;
    JOptionPane.showMessageDialog(null, "Απάντησες λάθος..");
    jLabel5.setText("");
    jLabel5.setIcon(new ImageIcon (PlayGame.class.getResource("../Images/failure.gif")));
    if (remainingLife == 0){
        clipFailure.setFramePosition(0);
        clipFailure.start();
        timer.start();
        JOptionPane.showMessageDialog(null, "Δυστυχώς έχασες..");
        clipGameOver.setFramePosition(0);
        clipGameOver.start();  
        do{
            try{
                Thread.sleep(50);
            }
            catch(InterruptedException ie){
                ie.printStackTrace();
            }  
        }while(clipGameOver.isActive());
        System.exit(0);
    }      
    clipFailure.setFramePosition(0);
    clipFailure.start();
    timer.start();
}

public void playRound(){
    selectedQuestion = random.nextInt(questions.size());

    jTextField3.setText(Integer.toString(remainingLife));
    jTextArea2.setText(questions.get(selectedQuestion).getQuestionName());


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

        fillAnswer = random.nextInt(questions.size());
        answerArray[i] = questions.get(fillAnswer).getQuestionAnswer();
        if (i==2){
            answerArray[i] = questions.get(selectedQuestion).getQuestionAnswer();
            continue;
        }        
     }
    Collections.shuffle(Arrays.asList(answerArray));

    jComboBox1.setModel(new javax.swing.DefaultComboBoxModel<>(answerArray));
}      

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:
    int selectedAnswer = jComboBox1.getSelectedIndex();


    jLabel5.setIcon(null);
    if (questions.get(selectedQuestion).getQuestionAnswer().trim().equals(answerArray[selectedAnswer].trim())){
        successAnswer();            
    } 
    else{
        wrongAnswer();
    }    

    timer.start();


}                                        

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         

    System.exit(0);

В IDE выводом является jframe с вопросом, комбинированное окно из 4 ответов, точки жизни игрока и две кнопки (одна дляблокировка ответа и один для выхода из программы).Но в exe-форме он даже не появляется.


EDIT - это ошибка, которую показывает программа-оболочка:

Исключение в потоке "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org / netbeans / lib / awtextra / AbsoluteLayout в quiz.PlayGame.initComponents (PlayGame.java:277) в quiz.PlayGame. (PlayGame.java:62)

...