1 package camidion.chordhelper.mididevice;
3 import java.awt.event.ActionEvent;
4 import java.awt.event.ActionListener;
6 import javax.sound.midi.MidiDevice;
7 import javax.swing.BoxLayout;
8 import javax.swing.JInternalFrame;
9 import javax.swing.JLabel;
10 import javax.swing.JPanel;
11 import javax.swing.JScrollPane;
12 import javax.swing.Timer;
13 import javax.swing.event.InternalFrameAdapter;
14 import javax.swing.event.InternalFrameEvent;
19 public class MidiDeviceFrame extends JInternalFrame {
21 private MidiConnecterListView listView;
23 * このデバイスフレームに貼り付けられた仮想MIDI端子リストビューを取得します。
24 * @return 仮想MIDI端子リストビュー
26 public MidiConnecterListView getMidiConnecterListView() { return listView; }
30 * このデバイスフレームのタイムスタンプ表示更新用タイマーを取得します。
31 * @return タイムスタンプ表示更新用タイマー
33 public Timer getTimer() { return timer; }
36 * MIDIデバイスのモデルからフレームビューを構築します。
37 * @param model MIDIデバイスのTransmitter/Receiverリストモデル
38 * @param cablePane MIDIケーブル描画面
40 public MidiDeviceFrame(MidiConnecterListModel model, MidiCablePane cablePane) {
41 super( null, true, true, false, false );
42 listView = new MidiConnecterListView(model, cablePane);
43 setTitle("[" + model.getMidiDeviceInOutType().getShortName() + "] " + model);
44 setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
45 addInternalFrameListener(new InternalFrameAdapter() {
47 public void internalFrameClosing(InternalFrameEvent e) {
48 MidiConnecterListModel m = listView.getModel();
50 setVisible(m.getMidiDevice().isOpen());
53 setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
54 add(new JScrollPane(listView));
57 timer = new Timer(50, new ActionListener() {
58 private long sec = -2;
59 private MidiDevice dev = listView.getModel().getMidiDevice();
61 public void actionPerformed(ActionEvent e) {
62 long usec = dev.getMicrosecondPosition();
63 long sec = (usec == -1 ? -1 : usec/1000000);
64 if( sec == this.sec ) return;
66 setText(sec == -1?"No TimeStamp":String.format("TimeStamp: %02d:%02d",sec/60,sec%60));