2014-11-07 10 views
0

Я очень хорошо знаю, что этот вопрос выскочил много, я искал, и я не мог найти решение этого вопроса, я пытаюсь создать JFrame, чтобы всплыть и показать кнопка, которая затем играет музыку в течение 4 секунд, но программа не будет даже показывать JFrameJFrame вообще не отображается

Это главный класс:

package practs; 

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

import javax.swing.JButton; 
import javax.swing.JFrame; 

public class Main { 

    private static JButton button; 

    public static void main(String[] args){ 
     Sound s = new Sound("/Users/seb/Documents/workspace(NormalJava)/practs/res/backgroundMusic.wav"); 

     JFrame f = new JFrame("Sound Meister"); 
     f.setFocusable(true); 
     f.setSize(300,300); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     button = new JButton("Press to view 4 secs of music"); 
     f.add(button); 
     button.addActionListener(
       new ActionListener(){ 
        public void actionPerformed(ActionEvent event){ 

         s.play(); 
         try { 
          Thread.sleep(4000); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 
         s.stop(); 
        } 
       } 
       ); 
     f.setVisible(true); 


    } 
} 
класс

Звук при необходимости:

package practs; 
import java.io.File; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.Clip; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.UnsupportedAudioFileException; 

public class Sound { 
    private Clip clip; 
    public Sound(String fileName) { 
     // specify the sound to play 
     // (assuming the sound can be played by the audio system) 
     // from a wave File 
     try { 
      File file = new File(fileName); 
      if (file.exists()) { 
       AudioInputStream sound = AudioSystem.getAudioInputStream(file); 
      // load the sound into memory (a Clip) 
       clip = AudioSystem.getClip(); 
       clip.open(sound); 
      } 
      else { 
       throw new RuntimeException("Sound: file not found: " + fileName); 
      } 
     } 
     catch (MalformedURLException e) { 
      e.printStackTrace(); 
      throw new RuntimeException("Sound: Malformed URL: " + e); 
     } 
     catch (UnsupportedAudioFileException e) { 
      e.printStackTrace(); 
      throw new RuntimeException("Sound: Unsupported Audio File: " + e); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
      throw new RuntimeException("Sound: Input/Output Error: " + e); 
     } 
     catch (LineUnavailableException e) { 
      e.printStackTrace(); 
      throw new RuntimeException("Sound: Line Unavailable Exception Error: " + e); 
     } 

    // play, stop, loop the sound clip 
    } 
    public void play(){ 
     clip.setFramePosition(0); // Must always rewind! 
     clip.start(); 
    } 
    public void loop(){ 
     clip.loop(Clip.LOOP_CONTINUOUSLY); 
    } 
    public void stop(){ 
     clip.stop(); 
    } 
} 

Я был бы очень рад, если бы кто-нибудь мог решить эту проблему для меня.

+2

Этот «Thread.sleep (4000);» - плохой старт. См. [Concurrency in Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/) для получения более подробной информации. – MadProgrammer

+0

@MadProgrammer даже после удаления Thread.sleep (в том числе try & catch явно) и просто оставьте s.play(); JFrame по-прежнему не показывает себя – BiblyDoo

+0

Без класса «Звук» он отлично работает для меня. Я использую Java 8, что вы используете ...? – MadProgrammer

ответ

0

После долгого свинчивания вокруг, это, казалось бы, один из тех ситуаций, когда не строит пользовательский интерфейс в контексте события диспетчерские темы вызывает какое-то тупик ...

В принципе, я взял тебя main блок кода, обернутые в EventQueue.invokeLater и он работал отлично ...

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
      } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       ex.printStackTrace(); 
      } 

      Sound s = new Sound("/Users/swhitehead/Downloads/checked.wav"); 

      JFrame f = new JFrame("Sound Meister"); 
      f.setFocusable(true); 
      f.setSize(300, 300); 
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      button = new JButton("Press to view 4 secs of music"); 
      f.add(button); 
      button.addActionListener(
        new ActionListener() { 
         public void actionPerformed(ActionEvent event) { 
          s.play(); 
          try { 
           Thread.sleep(4000); 
          } catch (InterruptedException e) { 
           e.printStackTrace(); 
          } 
          s.stop(); 
         } 
        } 
      ); 
      f.setVisible(true); 
     } 
    }); 

} 

вы всегда должны начать вы УИ в контексте событий Диспетчерская тему см Initial Threads для получения более подробной информации ...

Далее, что Thread.sleep вызовет некоторые проблемы, см. Concurrency in Swing для получения более подробной информации.

+0

Это сработало! Спасибо за помощь :) Я не совсем знаком с runnable, поэтому я уклоняюсь от этого, спасибо много снова :) – BiblyDoo

+0

Да, это было странно, я бы не ожидал такого поведения, но когда сомнение, вызовите позже: P – MadProgrammer

3

Как есть, ваш код не компилируется. Sounds s должен быть final, так как вы ссылаетесь на него в своем анонимном ActionListener классе.

final Sound s = 

Фиксация этого кадра должна быть показана. Если это все равно, то возможно new Sound() бросает исключение. Убедитесь, что вы используете среду разработки, в которой вы можете видеть вывод консоли.

+0

Достаточно смешно, под java 8 Я нашел, что final не кажется, требуется, или, по крайней мере, он компилируется, но без дополнительных доказательств, это хорошая аргументация. – MadProgrammer

+0

К сожалению, окончательный результат не работает. но я прокомментировал звук s = new Sound(); и s.play в ActionListener, и кнопка действительно отображается, но я уверен, что файл, который я дал, работает и найден программой. – BiblyDoo

Смежные вопросы