2017-06-05 3 views
1

Ich möchte Stimme mit UI fxml aufzeichnen. Aber ich weiß nicht, wie man diese Java-Datei auf dem von mir erstellten UI-fxml ausführt.Wie führe ich recorder.java mit fxml JavaFX aus?

JavaRecorder.java

package application; 

import java.io.File; 
import java.io.IOException; 

import javax.sound.sampled.AudioFileFormat; 
import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.DataLine; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.TargetDataLine; 

public class JavaRecorder { 

    static final long RECORD_TIME = 30000; // 0.5 minute 

     // path of the wav file 
     File wavFile = new File("C:/Users/Asus/Music/RecordAudio.wav"); 

     // format of audio file 
     AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE; 

     // the line from which audio data is captured 
     TargetDataLine line; 

     /** 
     * Defines an audio format 
     */ 
     AudioFormat getAudioFormat() { 
      float sampleRate = 16000; 
      int sampleSizeInBits = 8; 
      int channels = 2; 
      boolean signed = true; 
      boolean bigEndian = true; 
      AudioFormat format = new AudioFormat(sampleRate, sampleSizeInBits, 
               channels, signed, bigEndian); 
      return format; 
     } 

     /** 
     * Captures the sound and record into a WAV file 
     */ 
     void start() { 
      try { 
       AudioFormat format = getAudioFormat(); 
       DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); 

       // checks if system supports the data line 
       if (!AudioSystem.isLineSupported(info)) { 
        System.out.println("Line not supported"); 
        System.exit(0); 
       } 
       line = (TargetDataLine) AudioSystem.getLine(info); 
       line.open(format); 
       line.start(); // start capturing 

       System.out.println("Start capturing..."); 

       AudioInputStream ais = new AudioInputStream(line); 

       System.out.println("Start recording..."); 

       // start recording 
       AudioSystem.write(ais, fileType, wavFile); 

      } catch (LineUnavailableException ex) { 
       ex.printStackTrace(); 
      } catch (IOException ioe) { 
       ioe.printStackTrace(); 
      } 
     } 

     /** 
     * Closes the target data line to finish capturing and recording 
     */ 
     void finish() { 
      line.stop(); 
      line.close(); 
      System.out.println("Finished"); 
     } 

     /** 
     * Entry to run the program 
     */ 
     public static void main(String[] args) { 
      final JavaRecorder recorder = new JavaRecorder(); 

      // creates a new thread that waits for a specified 
      // of time before stopping 
      Thread stopper = new Thread(new Runnable() { 
       public void run() { 
        try { 
         Thread.sleep(RECORD_TIME); 
        } catch (InterruptedException ex) { 
         ex.printStackTrace(); 
        } 
        recorder.finish(); 
       } 
      }); 

      stopper.start(); 

      // start recording 
      recorder.start(); 
     } 
    } 

unten Codierung für UI fxml ..

Main.java

package application; 

import javafx.application.Application; 
import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.layout.AnchorPane; 
import javafx.fxml.FXMLLoader; 


public class Main extends Application { 
    @Override 
    public void start(Stage primaryStage) { 
     try { 
      AnchorPane root = (AnchorPane)FXMLLoader.load(getClass().getResource("First.fxml")); 
      Scene scene = new Scene(root,717,700); 
      scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 
      primaryStage.setScene(scene); 
      primaryStage.show(); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

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

} 

ich durch Klicken auf "Record" Taste aufnehmen möchten die ich in AyatP1.fxml erstellt habe.

AyatP1Controller.java

package application; 

import java.io.IOException; 
import java.net.URL; 
import java.util.ResourceBundle; 

import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.FXMLLoader; 
import javafx.fxml.Initializable; 
import javafx.scene.control.Button; 
import javafx.scene.layout.AnchorPane; 
import javafx.scene.media.MediaPlayer; 
import javafx.util.Duration; 

public class AyatP1Controller implements Initializable { 

    @FXML 
    private AnchorPane rootPane; 

    @Override 
    public void initialize(URL url, ResourceBundle rb){ 
     mediaPlayer.setOnEndOfMedia(()->button.setVisible(true)); 
    } 
    @FXML 
    private void loadPrev(ActionEvent event)throws IOException { 
     AnchorPane pane = (AnchorPane)FXMLLoader.load(getClass().getResource("MenuAyat.fxml")); 
     rootPane.getChildren().setAll(pane); 
    } 
    @FXML 
    private void loadNext(ActionEvent event)throws IOException { 
     AnchorPane pane = (AnchorPane)FXMLLoader.load(getClass().getResource("AyatP2.fxml")); 
     rootPane.getChildren().setAll(pane); 
    } 
    @FXML private Button button; 
    @FXML private Button rekod; 
    @FXML private MediaPlayer mediaPlayer; 



    @FXML 
    public void Playbtn(ActionEvent event){ 
     button.setVisible(false); 
     mediaPlayer.seek(Duration.ZERO); 
     mediaPlayer.play(); 
    } 
    @FXML 
    public void Playrecord(ActionEvent event){ 
     rekod.setVisible(false); 
    } 
} 

AyatP1.fxml

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.Button?> 
<?import javafx.scene.image.Image?> 
<?import javafx.scene.image.ImageView?> 
<?import javafx.scene.layout.AnchorPane?> 
<?import javafx.scene.media.Media?> 
<?import javafx.scene.media.MediaPlayer?> 
<?import javafx.scene.media.MediaView?> 

<AnchorPane fx:id="rootPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="598.0" prefWidth="717.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.AyatP1Controller"> 
    <children> 
     <ImageView fitHeight="598.0" fitWidth="761.0" pickOnBounds="true" preserveRatio="true"> 
     <image> 
      <Image url="@../../../../../Pictures/gambar/classroom.jpg" /> 
     </image> 
     </ImageView> 
     <ImageView fitHeight="260.0" fitWidth="385.0" layoutX="55.0" layoutY="94.0" pickOnBounds="true" preserveRatio="true"> 
     <image> 
      <Image url="@../../../../../Pictures/gambar/Slide1.jpg" /> 
     </image> 
     </ImageView> 
     <Button layoutX="411.0" layoutY="525.0" mnemonicParsing="false" onAction="#loadPrev"> 
     <graphic> 
      <ImageView fitHeight="48.0" fitWidth="48.0" pickOnBounds="true" preserveRatio="true"> 
       <image> 
        <Image url="@../../../../../Pictures/gambar/left_circle.png" /> 
       </image> 
      </ImageView> 
     </graphic> 
     </Button> 
     <Button layoutX="482.0" layoutY="525.0" mnemonicParsing="false" onAction="#loadNext"> 
     <graphic> 
      <ImageView fitHeight="48.0" fitWidth="48.0" pickOnBounds="true" preserveRatio="true"> 
       <image> 
        <Image url="@../../../../../Pictures/gambar/right_circle.png" /> 
       </image> 
      </ImageView> 
     </graphic> 
     </Button> 
     <Button fx:id="button" layoutX="125.0" layoutY="439.0" mnemonicParsing="false" onAction="#Playbtn" text="Start" /> 
     <Button fx:id="rekod" layoutX="222.0" layoutY="439.0" mnemonicParsing="false" onAction="#Playrecord" text="Record" /> 
     <Button layoutX="324.0" layoutY="439.0" mnemonicParsing="false" text="Stop" /> 
     <MediaView> 
        <mediaPlayer> 
         <MediaPlayer fx:id="mediaPlayer" autoPlay="false"> 
          <media> 
           <Media source="file:///C:/Users/Asus/Music/gitarresms.mp3" /> 
          </media> 
         </MediaPlayer> 
        </mediaPlayer>  
     </MediaView> 
    </children> 
</AnchorPane> 
+0

Haben Sie sich das einmal angesehen? Http: //docs.oracle.com/javafx/2/get_started/fxml_tutorial.htm –

+0

Sie sollten die Synchronisation hinzufügen, da Sie sonst nicht sicher sein können, ob der Stopper-Thread die Änderung des 'line' Feld ... – fabian

Antwort

0

Vielleicht möchten Sie die "First.fxml" zu "/First.fxml",

AnchorPane root = (AnchorPane)FXMLLoader.load(getClass().getResource("/First.fxml")); 

ändern auszuprobieren und dann dielaufen 10 Methode aus der Main Klasse.

Verwandte Themen