1 package camidion.chordhelper;
4 import java.awt.Dimension;
5 import java.awt.Graphics;
6 import java.awt.event.InputEvent;
7 import java.awt.event.MouseAdapter;
8 import java.awt.event.MouseEvent;
10 import javax.swing.JLabel;
12 import camidion.chordhelper.chordmatrix.ChordMatrix;
13 import camidion.chordhelper.music.Chord;
14 import camidion.chordhelper.music.MIDISpec;
15 import camidion.chordhelper.music.Note;
16 import camidion.chordhelper.pianokeyboard.PianoKeyboard;
21 public class ChordDisplayLabel extends JLabel {
22 private String defaultString = null;
23 private Chord chord = null;
24 private int noteNumber = -1;
25 private boolean isDark = false;
26 private boolean isMouseEntered = false;
29 * @param defaultString 初期表示する文字列
30 * @param chordMatrix このラベルをクリックしたときに鳴らす和音ボタンマトリクス
31 * @param keyboard このラベルをクリックしたときに鳴らす鍵盤
33 public ChordDisplayLabel(String defaultString, ChordMatrix chordMatrix, PianoKeyboard keyboard) {
34 super(defaultString, JLabel.CENTER);
35 this.defaultString = defaultString;
36 if( chordMatrix == null ) return;
37 addMouseListener(new MouseAdapter() {
39 public void mousePressed(MouseEvent e) {
40 if( chord != null ) { // コードが表示されている場合
41 if( (e.getModifiersEx() & InputEvent.BUTTON3_DOWN_MASK) != 0 ) {
43 chordMatrix.setSelectedChord((Chord)null);
47 // キーボードが指定されている場合、オリジナルキー(カポ反映済)のコードを使う。
48 if( keyboard == null )
49 chordMatrix.setSelectedChord(chord);
51 chordMatrix.setSelectedChordCapo(chord);
54 else if( noteNumber >= 0 ) { // 音階が表示されている場合
55 keyboard.noteOn(noteNumber);
59 public void mouseReleased(MouseEvent e) {
60 if( noteNumber >= 0 ) keyboard.noteOff(noteNumber);
63 public void mouseEntered(MouseEvent e) { mouseEntered(true); }
65 public void mouseExited(MouseEvent e) { mouseEntered(false); }
66 private void mouseEntered(boolean isMouseEntered) {
67 ChordDisplayLabel.this.isMouseEntered = isMouseEntered;
68 if( noteNumber >= 0 || chord != null ) repaint();
71 addMouseWheelListener(chordMatrix);
74 public void paint(Graphics g) {
76 Dimension d = getSize();
77 if( isMouseEntered && (noteNumber >= 0 || chord != null) ) {
78 g.setColor(Color.gray);
79 g.drawRect( 0, 0, d.width-1, d.height-1 );
84 * @param noteNumber MIDIノート番号
85 * @param isRhythmPart リズムパートのときtrue
87 public void setNote(int noteNumber, boolean isRhythmPart) {
90 if( (this.noteNumber = noteNumber) < 0 ) {
91 setText(defaultString);
95 String pn = MIDISpec.getPercussionName(noteNumber);
96 setText("MIDI note No." + noteNumber + " : " + pn);
99 String ns = Note.noteNumberToSymbol(noteNumber);
100 double f = MIDISpec.noteNumberToFrequency(noteNumber);
101 setText("Note: "+ns+" - MIDI note No."+noteNumber+" : "+Math.round(f)+"Hz");
108 public void setChord(Chord chord) {
109 this.noteNumber = -1;
110 if( (this.chord = chord) == null ) {
111 setText(defaultString);
112 setToolTipText(null);
116 setToolTipText("Chord: "+chord.toName());
122 public void clear() { setNote(-1, false); }
124 * ダークモードのON/OFFを切り替えます。
125 * @param isDark ダークモードONのときtrue
127 public void setDarkMode(boolean isDark) {
128 this.isDark = isDark;
129 if( chord != null ) setChordText();
131 private void setChordText() {
132 setText(chord.toHtmlString(isDark ? "#FFCC33" : "maroon"));