OSDN Git Service

リファクタリング
authorAkiyoshi Kamide <kamide@yk.rim.or.jp>
Sat, 28 May 2016 16:28:39 +0000 (01:28 +0900)
committerAkiyoshi Kamide <kamide@yk.rim.or.jp>
Sat, 28 May 2016 16:28:39 +0000 (01:28 +0900)
src/camidion/chordhelper/ChordHelperApplet.java
src/camidion/chordhelper/chorddiagram/CapoComboBoxModel.java [new file with mode: 0644]
src/camidion/chordhelper/chorddiagram/CapoSelecterView.java
src/camidion/chordhelper/chorddiagram/ChordDiagram.java
src/camidion/chordhelper/chorddiagram/ChordDiagramDisplay.java
src/camidion/chordhelper/chordmatrix/ChordMatrix.java
src/camidion/chordhelper/midieditor/MidiSequenceEditor.java
src/camidion/chordhelper/midieditor/PlaylistTableModel.java
src/camidion/chordhelper/pianokeyboard/PianoKeyboard.java

index 6ac2ca6..9982074 100644 (file)
@@ -51,6 +51,7 @@ import javax.swing.event.HyperlinkEvent;
 import javax.swing.event.HyperlinkListener;
 
 import camidion.chordhelper.anogakki.AnoGakkiPane;
+import camidion.chordhelper.chorddiagram.CapoComboBoxModel;
 import camidion.chordhelper.chorddiagram.ChordDiagram;
 import camidion.chordhelper.chordmatrix.ChordButtonLabel;
 import camidion.chordhelper.chordmatrix.ChordMatrix;
@@ -278,7 +279,7 @@ public class ChordHelperApplet extends JApplet {
         */
        public static class VersionInfo {
                public static final String      NAME = "MIDI Chord Helper";
-               public static final String      VERSION = "Ver.20160526.1";
+               public static final String      VERSION = "Ver.20160528.1";
                public static final String      COPYRIGHT = "Copyright (C) 2004-2016";
                public static final String      AUTHER = "@きよし - Akiyoshi Kamide";
                public static final String      URL = "http://www.yk.rim.or.jp/~kamide/music/chordhelper/";
@@ -393,7 +394,7 @@ public class ChordHelperApplet extends JApplet {
        private TempoSelecter tempoSelecter;
        private TimeSignatureSelecter timesigSelecter;
        private KeySignatureLabel keysigLabel;
-       private JLabel songTitleLabel;
+       private JLabel songTitleLabel = new JLabel();
        private AnoGakkiPane anoGakkiPane;
        private JToggleButton anoGakkiToggleButton;
 
@@ -410,8 +411,10 @@ public class ChordHelperApplet extends JApplet {
                // 背景色の取得
                rootPaneDefaultBgcolor = getContentPane().getBackground();
                //
-               // コードボタンとピアノ鍵盤のセットアップ
-               chordMatrix = new ChordMatrix() {{
+               // コードダイアグラム、コードボタン、ピアノ鍵盤のセットアップ
+               CapoComboBoxModel capoValueModel = new CapoComboBoxModel();
+               chordDiagram = new ChordDiagram(capoValueModel);
+               chordMatrix = new ChordMatrix(capoValueModel) {{
                        addChordMatrixListener(new ChordMatrixListener(){
                                public void keySignatureChanged() {
                                        Key capoKey = getKeySignatureCapo();
@@ -421,6 +424,11 @@ public class ChordHelperApplet extends JApplet {
                                public void chordChanged() { chordOn(); }
                        });
                }};
+               keysigLabel = new KeySignatureLabel() {{
+                       addMouseListener(new MouseAdapter() {
+                               public void mousePressed(MouseEvent e) { chordMatrix.setKeySignature(getKey()); }
+                       });
+               }};
                chordMatrix.capoSelecter.checkbox.addItemListener(new ItemListener() {
                        public void itemStateChanged(ItemEvent e) {
                                chordOn();
@@ -450,8 +458,9 @@ public class ChordHelperApplet extends JApplet {
                        });
                        keyboardCenterPanel.keyboard.setPreferredSize(new Dimension(571, 80));
                }};
-               // MIDIデバイス一覧を構築
                VirtualMidiDevice guiMidiDevice = keyboardPanel.keyboardCenterPanel.keyboard.midiDevice;
+               //
+               // MIDIデバイス一覧を構築
                MidiTransceiverListModelList deviceModelList = new MidiTransceiverListModelList(Arrays.asList(guiMidiDevice));
                (midiDeviceDialog = new MidiDeviceDialog(deviceModelList)).setIconImage(iconImage);
                //
@@ -467,6 +476,7 @@ public class ChordHelperApplet extends JApplet {
                // MIDIエディタのイベントダイアログを、ピアノ鍵盤のイベント送出ダイアログと共用
                keyboardPanel.setEventDialog(midiEditor.eventDialog);
                //
+               // 歌詞表示
                lyricDisplay = new ChordTextField(sequencerModel) {{
                        addActionListener(new ActionListener() {
                                @Override
@@ -478,43 +488,36 @@ public class ChordHelperApplet extends JApplet {
                }};
                lyricDisplayDefaultBorder = lyricDisplay.getBorder();
                lyricDisplayDefaultBgcolor = lyricDisplay.getBackground();
-               chordDiagram = new ChordDiagram(this);
+               //
+               // メタイベント(テンポ・拍子・調号)を受信して表示するリスナーを登録
                Sequencer sequencer = sequencerModel.getSequencer();
                sequencer.addMetaEventListener(tempoSelecter = new TempoSelecter() {{ setEditable(false); }});
                sequencer.addMetaEventListener(timesigSelecter = new TimeSignatureSelecter() {{ setEditable(false); }});
-               keysigLabel = new KeySignatureLabel() {{
-                       addMouseListener(new MouseAdapter() {
-                               public void mousePressed(MouseEvent e) { chordMatrix.setKeySignature(getKey()); }
-                       });
-               }};
-               sequencer.addMetaEventListener(
-                       new MetaEventListener() {
-                               private Key key;
-                               @Override
-                               public void meta(MetaMessage msg) {
-                                       switch(msg.getType()) {
-                                       case 0x59: // Key signature (2 bytes) : 調号
-                                               key = new Key(msg.getData());
-                                               if( SwingUtilities.isEventDispatchThread() ) {
-                                                       keysigLabel.setKeySignature(key);
-                                                       chordMatrix.setKeySignature(key);
-                                               } else {
-                                                       // MIDIシーケンサのスレッドから呼ばれた場合、GUI更新は自分で行わず、
-                                                       // AWTイベントディスパッチスレッドに依頼する。
-                                                       SwingUtilities.invokeLater(new Runnable() {
-                                                               @Override
-                                                               public void run() {
-                                                                       keysigLabel.setKeySignature(key);
-                                                                       chordMatrix.setKeySignature(key);
-                                                               }
-                                                       });
-                                               }
-                                               break;
+               sequencer.addMetaEventListener(new MetaEventListener() {
+                       private Key key;
+                       @Override
+                       public void meta(MetaMessage msg) {
+                               switch(msg.getType()) {
+                               case 0x59: // Key signature (2 bytes) : 調号
+                                       key = new Key(msg.getData());
+                                       if( SwingUtilities.isEventDispatchThread() ) {
+                                               keysigLabel.setKeySignature(key);
+                                               chordMatrix.setKeySignature(key);
+                                       } else {
+                                               // MIDIシーケンサのスレッドから呼ばれた場合、GUI更新は自分で行わず、
+                                               // AWTイベントディスパッチスレッドに依頼する。
+                                               SwingUtilities.invokeLater(new Runnable() {
+                                                       @Override
+                                                       public void run() {
+                                                               keysigLabel.setKeySignature(key);
+                                                               chordMatrix.setKeySignature(key);
+                                                       }
+                                               });
                                        }
+                                       break;
                                }
                        }
-               );
-               songTitleLabel = new JLabel();
+               });
                //シーケンサーの時間スライダーの値が変わったときのリスナーを登録
                sequencerModel.addChangeListener(new ChangeListener() {
                        @Override
diff --git a/src/camidion/chordhelper/chorddiagram/CapoComboBoxModel.java b/src/camidion/chordhelper/chorddiagram/CapoComboBoxModel.java
new file mode 100644 (file)
index 0000000..cfb0aef
--- /dev/null
@@ -0,0 +1,23 @@
+package camidion.chordhelper.chorddiagram;
+
+import javax.swing.ComboBoxModel;
+import javax.swing.event.ListDataListener;
+
+/**
+ * カポ選択コンボボックスモデル(選択範囲:1~11)
+ */
+public class CapoComboBoxModel implements ComboBoxModel<Integer> {
+       private Integer selectedValue = Integer.valueOf(1);
+       @Override
+       public int getSize() { return 11; }
+       @Override
+       public Integer getElementAt(int index) { return Integer.valueOf(index + 1); }
+       @Override
+       public void addListDataListener(ListDataListener l) { }
+       @Override
+       public void removeListDataListener(ListDataListener l) { }
+       @Override
+       public void setSelectedItem(Object item) { selectedValue = (Integer)item; }
+       @Override
+       public Object getSelectedItem() { return selectedValue; }
+}
index 040de9e..204c2a7 100644 (file)
@@ -4,7 +4,6 @@ import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
 
 import javax.swing.BoxLayout;
-import javax.swing.ComboBoxModel;
 import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
 import javax.swing.JPanel;
@@ -12,29 +11,28 @@ import javax.swing.JPanel;
 /**
  * カポ選択ビュー
  */
-public class CapoSelecterView extends JPanel implements ItemListener {
+public class CapoSelecterView extends JPanel {
        /**
         * カポON/OFFチェックボックス
         */
-       public JCheckBox checkbox = new JCheckBox("Capo") {
-               {
-                       setOpaque(false);
-               }
-       };
+       public JCheckBox checkbox = new JCheckBox("Capo") {{ setOpaque(false); }};
        /**
         * カポ位置選択コンボボックス
         */
-       public JComboBox<Integer> valueSelecter = new JComboBox<Integer>() {
-               {
-                       setMaximumRowCount(12);
-                       setVisible(false);
-               }
-       };
+       public JComboBox<Integer> valueSelecter = new JComboBox<Integer>() {{
+               setMaximumRowCount(12);
+               setVisible(false);
+       }};
        /**
         * カポ選択ビューを構築します。
         */
        public CapoSelecterView() {
-               checkbox.addItemListener(this);
+               checkbox.addItemListener(new ItemListener() {
+                       @Override
+                       public void itemStateChanged(ItemEvent e) {
+                               valueSelecter.setVisible(checkbox.isSelected());
+                       }
+               });
                setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
                add(checkbox);
                add(valueSelecter);
@@ -43,14 +41,10 @@ public class CapoSelecterView extends JPanel implements ItemListener {
         * 指定されたデータモデルを操作するカポ選択ビューを構築します。
         * @param model データモデル
         */
-       public CapoSelecterView(ComboBoxModel<Integer> model) {
+       public CapoSelecterView(CapoComboBoxModel model) {
                this();
                valueSelecter.setModel(model);
        }
-       @Override
-       public void itemStateChanged(ItemEvent e) {
-               valueSelecter.setVisible(checkbox.isSelected());
-       }
        /**
         * カポ位置を返します。
         * @return カポ位置
index 9b39fa0..d2e7589 100644 (file)
@@ -18,6 +18,7 @@ import java.util.Objects;
 import javax.swing.Box;
 import javax.swing.BoxLayout;
 import javax.swing.ButtonGroup;
+import javax.swing.ComboBoxModel;
 import javax.swing.JPanel;
 import javax.swing.JRadioButton;
 import javax.swing.JScrollBar;
@@ -26,7 +27,6 @@ import javax.swing.SwingConstants;
 
 import camidion.chordhelper.ButtonIcon;
 import camidion.chordhelper.ChordDisplayLabel;
-import camidion.chordhelper.ChordHelperApplet;
 import camidion.chordhelper.music.Chord;
 
 /**
@@ -71,10 +71,10 @@ public class ChordDiagram extends JPanel {
        }
        /**
         * コードダイアグラムを構築します。
-        * @param applet 親となるアプレット
+        * @param capoValueModel カポ値選択コンボボックスのデータモデル
         */
-       public ChordDiagram(ChordHelperApplet applet) {
-               capoSelecterView.valueSelecter.setModel(applet.chordMatrix.capoValueModel);
+       public ChordDiagram(ComboBoxModel<Integer> capoValueModel) {
+               capoSelecterView.valueSelecter.setModel(capoValueModel);
                setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
                add(new JPanel() {
                        {
index b02d58e..a751ba9 100644 (file)
@@ -27,8 +27,7 @@ import camidion.chordhelper.music.NoteSymbol;
 /**
  * コードダイアグラム表示部
  */
-class ChordDiagramDisplay extends JComponent
-       implements MouseListener, MouseMotionListener {
+class ChordDiagramDisplay extends JComponent implements MouseListener, MouseMotionListener {
        /**
         * 可視フレット数
         */
@@ -60,8 +59,7 @@ class ChordDiagramDisplay extends JComponent
        /**
         * フレット方向の横スクロールバーで使用する境界つき値範囲
         */
-       DefaultBoundedRangeModel fretViewIndexModel
-               = new DefaultBoundedRangeModel( 0, VISIBLE_FRETS, 0, MAX_FRETS );
+       DefaultBoundedRangeModel fretViewIndexModel = new DefaultBoundedRangeModel( 0, VISIBLE_FRETS, 0, MAX_FRETS );
        /**
         * チューニング対象楽器
         */
@@ -122,9 +120,7 @@ class ChordDiagramDisplay extends JComponent
                 * 指定した弦を弾かないことを表す {@link PressingPoint} を構築します。
                 * @param stringIndex 弦インデックス
                 */
-               public PressingPoint(int stringIndex) {
-                       this(-1,-1,stringIndex);
-               }
+               public PressingPoint(int stringIndex) { this(-1,-1,stringIndex); }
                /**
                 * 指定した弦、フレットを押さえると
                 * 指定されたコード構成音が鳴ることを表す {@link PressingPoint} を構築します。
@@ -151,7 +147,7 @@ class ChordDiagramDisplay extends JComponent
        /**
         * 押さえる場所リスト(配列要素として使えるようにするための空の継承クラス)
         */
-       private class PressingPointList extends LinkedList<PressingPoint> {
+       private static class PressingPointList extends LinkedList<PressingPoint> {
        }
        /**
         * コードの押さえ方のバリエーション
@@ -261,9 +257,7 @@ class ChordDiagramDisplay extends JComponent
                                        scanFret( stringIndex + 1 );
                                        continue;
                                }
-                               if( hasValidNewVariation() ) {
-                                       add(validatingPoints.clone());
-                               }
+                               if( hasValidNewVariation() ) add(validatingPoints.clone());
                        }
                }
                /**
@@ -531,18 +525,13 @@ class ChordDiagramDisplay extends JComponent
        @Override
        public void mouseReleased(MouseEvent e) { }
        @Override
-       public void mouseEntered(MouseEvent e) {
-               mouseMoved(e);
-       }
+       public void mouseEntered(MouseEvent e) { mouseMoved(e); }
        @Override
-       public void mouseExited(MouseEvent e) {
-               mouseMoved(e);
-       }
+       public void mouseExited(MouseEvent e) { mouseMoved(e); }
        @Override
        public void mouseClicked(MouseEvent e) { }
        @Override
-       public void mouseDragged(MouseEvent e) {
-       }
+       public void mouseDragged(MouseEvent e) { }
        @Override
        public void mouseMoved(MouseEvent e) {
                Point point = e.getPoint();
@@ -633,15 +622,10 @@ class ChordDiagramDisplay extends JComponent
        /**
         * コード(和音)を再設定します。
         */
-       public void setChord() {
-               setChord(chordVariations.chord);
-       }
+       public void setChord() { setChord(chordVariations.chord); }
        /**
         * コード(和音)を設定します。
         * @param chord コード
         */
-       public void setChord(Chord chord) {
-               chordVariations.setChord(chord);
-               repaint();
-       }
-}
\ No newline at end of file
+       public void setChord(Chord chord) { chordVariations.setChord(chord); repaint(); }
+}
index b0c3b63..de63731 100644 (file)
@@ -23,8 +23,6 @@ import java.awt.event.MouseWheelEvent;
 import java.awt.event.MouseWheelListener;
 import java.util.ArrayList;
 
-import javax.swing.ComboBoxModel;
-import javax.swing.DefaultComboBoxModel;
 import javax.swing.JComponent;
 import javax.swing.JLabel;
 import javax.swing.JOptionPane;
@@ -32,6 +30,7 @@ import javax.swing.JPanel;
 
 import camidion.chordhelper.ButtonIcon;
 import camidion.chordhelper.ChordDisplayLabel;
+import camidion.chordhelper.chorddiagram.CapoComboBoxModel;
 import camidion.chordhelper.chorddiagram.CapoSelecterView;
 import camidion.chordhelper.midieditor.SequenceTickIndex;
 import camidion.chordhelper.music.Chord;
@@ -44,7 +43,7 @@ import camidion.chordhelper.music.SymbolLanguage;
  * MIDI Chord Helper 用のコードボタンマトリクス
  *
  * @author
- *     Copyright (C) 2004-2013 Akiyoshi Kamide
+ *     Copyright (C) 2004-2016 Akiyoshi Kamide
  *     http://www.yk.rim.or.jp/~kamide/music/chordhelper/
  */
 public class ChordMatrix extends JPanel
@@ -538,41 +537,23 @@ public class ChordMatrix extends JPanel
        private ColorSet currentColorset = normalModeColorset;
 
        /**
-        * カポ値選択コンボボックスのデータモデル
-        * (コードボタン側とコードダイアグラム側の両方から参照される)
-        */
-       public ComboBoxModel<Integer> capoValueModel =
-               new DefaultComboBoxModel<Integer>() {
-                       {
-                               for( int i=1; i<=Music.SEMITONES_PER_OCTAVE-1; i++ )
-                                       addElement(i);
-                       }
-               };
-       /**
         * カポ値選択コンボボックス(コードボタン側ビュー)
         */
-       public CapoSelecterView capoSelecter = new CapoSelecterView(capoValueModel) {
-               private void capoChanged() {
-                       ChordMatrix.this.capoChanged(getCapo());
-               }
-               {
-                       checkbox.addItemListener(
-                               new ItemListener() {
-                                       public void itemStateChanged(ItemEvent e) {capoChanged();}
-                               }
-                       );
-                       valueSelecter.addActionListener(
-                               new ActionListener() {
-                                       public void actionPerformed(ActionEvent e) {capoChanged();}
-                               }
-                       );
-               }
-       };
+       public CapoSelecterView capoSelecter;
 
        /**
         * コードボタンマトリクスの構築
+        * @param capoValueModel カポ選択値モデル
         */
-       public ChordMatrix() {
+       public ChordMatrix(CapoComboBoxModel capoValueModel) {
+               capoSelecter = new CapoSelecterView(capoValueModel) {{
+                       checkbox.addItemListener(new ItemListener() {
+                               public void itemStateChanged(ItemEvent e) {capoChanged(getCapo());}
+                       });
+                       valueSelecter.addActionListener(new ActionListener() {
+                               public void actionPerformed(ActionEvent e) {capoChanged(getCapo());}
+                       });
+               }};
                int i, v;
                Dimension buttonSize = new Dimension(28,26);
                //
index 64e75a8..98b8cd5 100644 (file)
@@ -96,12 +96,6 @@ public class MidiSequenceEditor extends JDialog {
                }
        };
 
-       private VirtualMidiDevice outputMidiDevice;
-       /**
-        * イベントリスト操作音出力先MIDIデバイスを返します。
-        */
-       //public VirtualMidiDevice getEventTableMidiDevice() { return eventListTable.outputMidiDevice; }
-
        /**
         * エラーメッセージダイアログを表示します。
         * @param message エラーメッセージ
@@ -221,6 +215,7 @@ public class MidiSequenceEditor extends JDialog {
         * MIDIイベント入力ダイアログ(イベント入力とイベント送出で共用)
         */
        public MidiEventDialog eventDialog = new MidiEventDialog();
+       private VirtualMidiDevice outputMidiDevice;
        /**
         * プレイリストビュー(シーケンスリスト)
         */
@@ -389,7 +384,7 @@ public class MidiSequenceEditor extends JDialog {
                                //
                                // セル内にプレイボタンがあれば、シングルクリックを受け付ける。
                                // プレイボタンのないセルは、ダブルクリックのみ受け付ける。
-                               return model.sequenceList.get(row).isOnSequencer() || me.getClickCount() == 2;
+                               return model.getSequenceList().get(row).isOnSequencer() || me.getClickCount() == 2;
                        }
                        @Override
                        public Object getCellEditorValue() { return null; }
@@ -408,7 +403,7 @@ public class MidiSequenceEditor extends JDialog {
                        ) {
                                fireEditingStopped();
                                PlaylistTableModel model = getModel();
-                               if( model.sequenceList.get(row).isOnSequencer() ) return playButton;
+                               if( model.getSequenceList().get(row).isOnSequencer() ) return playButton;
                                model.loadToSequencer(row);
                                return null;
                        }
@@ -418,7 +413,7 @@ public class MidiSequenceEditor extends JDialog {
                                boolean hasFocus, int row, int column
                        ) {
                                PlaylistTableModel model = getModel();
-                               if(model.sequenceList.get(row).isOnSequencer()) return playButton;
+                               if(model.getSequenceList().get(row).isOnSequencer()) return playButton;
                                Class<?> cc = model.getColumnClass(column);
                                TableCellRenderer defaultRenderer = table.getDefaultRenderer(cc);
                                return defaultRenderer.getTableCellRendererComponent(
@@ -722,6 +717,7 @@ public class MidiSequenceEditor extends JDialog {
                                newTrackModel.eventSelectionModel.addListSelectionListener(eventSelectionListener);
                        }
                }
+
                /**
                 * イベント選択リスナー
                 */
index 6bd4e12..f0fc9ad 100644 (file)
@@ -60,7 +60,7 @@ public class PlaylistTableModel extends AbstractTableModel {
        };
        /**
         * 新しいプレイリストのテーブルモデルを構築します。
-        * @param sequencerModel MIDIシーケンサーモデル
+        * @param sequencerModel 連携するMIDIシーケンサーモデル
         */
        public PlaylistTableModel(MidiSequencerModel sequencerModel) {
                this.sequencerModel = sequencerModel;
@@ -74,7 +74,7 @@ public class PlaylistTableModel extends AbstractTableModel {
                                /**
                                 * {@inheritDoc}
                                 *
-                                * <p>EOT (End Of Trackã\80\81type==0x2F) ã\82\92å\8f\97ä¿¡ã\81\97ã\81\9fã\81¨ã\81\8dã\81®å\87¦ç\90\86ã\81§す。
+                                * <p>EOT (End Of Trackã\80\81type==0x2F) ã\82\92å\8f\97ä¿¡ã\81\97ã\81\9fã\81¨ã\81\8dã\80\81次ã\81®æ\9b²ã\81¸é\80²ã\81¿ã\81¾す。
                                 * </p>
                                 * <p>これは MetaEventListener のための実装なので、多くの場合
                                 * Swing EDT ではなく MIDI シーケンサの EDT から起動されます。
@@ -107,7 +107,7 @@ public class PlaylistTableModel extends AbstractTableModel {
         * <p>リピートモードの場合は同じ曲をもう一度再生、
         * そうでない場合は次の曲へ進んで再生します。
         * 次の曲がなければ、そこで停止します。
-        * いずれの場合もの先頭へ戻ります。
+        * いずれの場合もの先頭へ戻ります。
         * </p>
         */
        private void goNext() {
@@ -134,7 +134,11 @@ public class PlaylistTableModel extends AbstractTableModel {
        /**
         * シーケンスリスト
         */
-       List<SequenceTrackListTableModel> sequenceList = new Vector<>();
+       private List<SequenceTrackListTableModel> sequenceList = new Vector<>();
+       /**
+        * このプレイリストが保持している {@link SequenceTrackListTableModel} のリストを返します。
+        */
+       public List<SequenceTrackListTableModel> getSequenceList() { return sequenceList; }
        /**
         * 行が選択されているときだけイネーブルになるアクション
         */
index 9fe5fc4..e00e5f6 100644 (file)
@@ -101,7 +101,7 @@ public class PianoKeyboard extends JComponent {
        /**
         * ノートのリスト。配列の要素として使えるようクラス名を割り当てます。
         */
-       private class NoteList extends LinkedList<Integer> {
+       private static class NoteList extends LinkedList<Integer> {
                // 何もすることはない
        }
        /**