Hallo,
ich habe nun einiges über die Verwendung von Threads und die Trennung von GUI und Berechnungen gelesen. Mich interessierte insbesondere das Problem, dass bei Ausführung einer Berechnung (in dem folgenden Beispiel das Abspielen eines .mid Files) die GUI für die Zeit der Berechnung(abspielen) hängt.
Ich habe mir folgendes Beispiel zurecht gelegt:
Die public class MidiSequenzer ist die Klasse für das Abspielen der .mid files.
Die public class DefaultJTree ist die Klasse, die einen JTree mit den abzuspielenden Files aufzeigt. Im folgenden Beispiel habe ich zu Testzwecken ein File vorgegeben (wird später noch ausprogrammiert).
Und siehe da, das Problem, dass die GUI für die Zeit des Abspielens hängt, äußert sich auch bei diesem Beispiel.
Für ein paar Tipps, wie ich dieses Problem lösen kann, wäre ich sehr dankbar. Ich poste mal noch die 2 Klassen.
P.S. Die Klassen habe ich aus einem Workshop aus dem Javabuch
ich habe nun einiges über die Verwendung von Threads und die Trennung von GUI und Berechnungen gelesen. Mich interessierte insbesondere das Problem, dass bei Ausführung einer Berechnung (in dem folgenden Beispiel das Abspielen eines .mid Files) die GUI für die Zeit der Berechnung(abspielen) hängt.
Ich habe mir folgendes Beispiel zurecht gelegt:
Die public class MidiSequenzer ist die Klasse für das Abspielen der .mid files.
Die public class DefaultJTree ist die Klasse, die einen JTree mit den abzuspielenden Files aufzeigt. Im folgenden Beispiel habe ich zu Testzwecken ein File vorgegeben (wird später noch ausprogrammiert).
Und siehe da, das Problem, dass die GUI für die Zeit des Abspielens hängt, äußert sich auch bei diesem Beispiel.
Für ein paar Tipps, wie ich dieses Problem lösen kann, wäre ich sehr dankbar. Ich poste mal noch die 2 Klassen.
P.S. Die Klassen habe ich aus einem Workshop aus dem Javabuch
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;
public class DefaultJTree
extends JFrame
{
public DefaultJTree()
{
super("JTree 2");
MidiSequenzer midi = new MidiSequenzer();
setDefaultCloseOperation(EXIT_ON_CLOSE);
//Einfaches TreeModel bauen
DefaultMutableTreeNode root, child, subchild;
root = new DefaultMutableTreeNode("Root");
for (int i = 1; i <= 5; ++i) {
String name = "Child-" + i;
child = new DefaultMutableTreeNode(name);
root.add(child);
for (int j = 1; j <= 3; ++j) {
subchild = new DefaultMutableTreeNode(name + "-" + j);
child.add(subchild);
}
}
//JTree erzeugen und Einfachselektion aktivieren
JTree tree = new JTree(root);
TreeSelectionModel tsm = new DefaultTreeSelectionModel();
tsm.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
tree.setSelectionModel(tsm);
tree.setRootVisible(true);
//JTree einfügen
Container cp = getContentPane();
cp.add(new JScrollPane(tree), BorderLayout.CENTER);
//TreeSelectionListener hinzufügen
tree.addTreeSelectionListener(
new TreeSelectionListener()
{
public void valueChanged(TreeSelectionEvent event)
{
TreePath tp = event.getNewLeadSelectionPath();
if (tp != null) {
System.out.println(" Selektiert: " + tp.toString());
MidiSequenzer midi = new MidiSequenzer(); // <-- Aufruf Midi Sequenzer
midi.playMidi("ame.mid"); // <-- !!! Hier kommt später noch die Übergabe Dateiname aus Baum" !!!
} else {
System.out.println(" Kein Element selektiert");
}
}
}
);
}
public static void main(String[] args)
{
try {
DefaultJTree frame = new DefaultJTree();
frame.setLocation(100, 100);
frame.setSize(250, 200);
frame.setVisible(true);
} catch (Exception e) {
}
}
}
Code:
import java.io.*;
import javax.sound.midi.*;
public class MidiSequenzer
{
private static void playMidiFile(String name)
throws Exception
{
//Sequencer und Synthesizer initialisieren
Sequencer sequencer = MidiSystem.getSequencer();
Transmitter trans = sequencer.getTransmitter();
Synthesizer synth = MidiSystem.getSynthesizer();
Receiver rcvr = synth.getReceiver();
//Beide öffnen und verbinden
sequencer.open();
synth.open();
trans.setReceiver(rcvr);
//Sequence lesen und abspielen
Sequence seq = MidiSystem.getSequence(new File(name));
sequencer.setSequence(seq);
sequencer.setTempoInBPM(145);
sequencer.start();
while (true) {
try {
Thread.sleep(100);
} catch (Exception e) {
//nothing
}
if (!sequencer.isRunning()) {
break;
}
}
//Sequencer anhalten und Geräte schließen
sequencer.stop();
sequencer.close();
synth.close();
}
// Diese Methode habe ich für den Aufruf in der Klasse DefaultJTree noch hinzugefügt
public void playMidi(String name){
try {
playMidiFile(name);
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
System.exit(0);
}
}