: कि श्रोता ही जो ArrayList<String>
यह में कुछ भी नहीं के साथ एक वस्तु होने में परिणाम है जिस तरह से करने के बाद बढ़ाया पाश समाप्त हो गया है काम करता है
यहाँ एक नमूना है श्रोता जोड़ने के साथ मीडिया स्रोत मेटाडेटा को पढ़ने का दूसरा तरीका Mediaplayer .setOnReady() में उस जानकारी को निकाला जाता है; यहाँ जावा नियंत्रक वर्ग
सार्वजनिक वर्ग uiController लागू करता Initializable {
@FXML private Label label;
@FXML private ListView<String> lv;
@FXML private AnchorPane root;
@FXML private Button button;
private ObservableList<String> ol= FXCollections.observableArrayList();
private List<File> selectedFiles;
private final Object obj= new Object();
@Override
public void initialize(URL url, ResourceBundle rb) {
assert button != null : "fx:id=\"button\" was not injected: check your FXML file 'ui.fxml'.";
assert label != null : "fx:id=\"label\" was not injected: check your FXML file 'ui.fxml'.";
assert lv != null : "fx:id=\"lv\" was not injected: check your FXML file 'ui.fxml'.";
assert root != null : "fx:id=\"root\" was not injected: check your FXML file 'ui.fxml'.";
// initialize your logic here: all @FXML variables will have been injected
lv.setItems(ol);
}
@FXML private void open(ActionEvent event) {
FileChooser.ExtensionFilter extention= new FileChooser.ExtensionFilter("Music Files", "*.mp3","*.m4a","*.aif","*.wav","*.m3u","*.m3u8");
FileChooser fc= new FileChooser();
fc.setInitialDirectory(new File(System.getenv("userprofile")));
fc.setTitle("Select File(s)");
fc.getExtensionFilters().add(extention);
selectedFiles =fc.showOpenMultipleDialog(root.getScene().getWindow());
if(selectedFiles != null &&!selectedFiles.isEmpty()){
listFiles();
}
}
/**
* Convert each fie selected to its URI
*/
private void listFiles(){
try {
for (File file : selectedFiles) {
readMetaData(file.toURI().toString());
synchronized(obj){
obj.wait(100);
}
}
} catch (InterruptedException ex) {
}
System.gc();
}
/**
* Read a Media source metadata
* Note: Sometimes the was unable to extract the metadata especially when
* i have selected large number of files reasons i don't known why
* @param mediaURI Media file URI
*/
private void readMetaData(String mediaURI){
final MediaPlayer mp= new MediaPlayer(new Media(mediaURI));
mp.setOnReady(new Runnable() {
@Override
public void run() {
String artistName=(String) mp.getMedia().getMetadata().get("artist");
ol.add(artistName);
synchronized(obj){//this is required since mp.setOnReady creates a new thread and our loopp in the main thread
obj.notify();// the loop has to wait unitl we are able to get the media metadata thats why use .wait() and .notify() to synce the two threads(main thread and MediaPlayer thread)
}
}
});
}
} का एक उदाहरण हिस्सा है
कुछ परिवर्तन है कि बना दिया है मेटाडाटा से कलाकार का नाम स्टोर करने के लिए एक ObservableList प्रयोग किया जाता है
कोड में आप पाएंगे इस
synchronized(obj){
obj.wait(100);
}
मैं ऐसा इस वजह मीडियाप्लेयर .setOnReady() एक नया धागा बनाता है और पाश में है मुख्य अनुप्रयोग धागा, लूप को अन्य थ्रेड बनने से पहले कुछ समय तक इंतजार करना पड़ता है और हम मेटाडेटा निकालने में सक्षम होते हैं, और .setOnReady() में
synchronized(obj){
obj.notify;
}
मुख्य धागे को जागने के लिए लूप होता है इसलिए लूप अगले आइटम
मैं मानता हूं कि यह ऐसा करने का सबसे अच्छा समाधान नहीं हो सकता है, लेकिन फाइलों की सूची से JavaFx मीडिया मेटाडेटा को पढ़ने के तरीके के बारे में कोई बेहतर तरीका है, पूर्ण NetBeans परियोजना यहां पाया जा सकता https://docs.google.com/file/d/0BxDEmOcXqnCLSTFHbTVFcGIzT1E/edit?usp=sharing
प्लस जो मेटाडाटा के उपयोग expolits JavaFX का उपयोग कर एक छोटा सा MediaPlayer आवेदन बनाया है https://docs.google.com/file/d/0BxDEmOcXqnCLR1Z0VGN4ZlJkbUU/edit?usp=sharing