Swing/SpinnerTextColor のバックアップ(No.7)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/SpinnerTextColor へ行く。
- 1 (2013-04-29 (月) 08:31:48)
- 2 (2015-10-13 (火) 20:06:28)
- 3 (2017-04-12 (水) 18:56:21)
- 4 (2018-03-28 (水) 18:18:34)
- 5 (2018-04-02 (月) 18:32:17)
- 6 (2018-04-04 (水) 21:33:15)
- 7 (2018-04-09 (月) 14:54:35)
- 8 (2018-04-19 (木) 13:49:19)
- 9 (2018-04-20 (金) 17:21:35)
- 10 (2020-04-12 (日) 01:37:28)
- 11 (2021-10-19 (火) 13:00:03)
- category: swing folder: SpinnerTextColor title: JComboBoxをJSpinnerの代わりに使用する tags: [JSpinner, JComboBox, ListCellRenderer, Html, ActionMap] author: aterai pubdate: 2013-04-29T08:31:48+09:00 description: JSpinnerの代わりにJComboBoxを使用することで、アイテムの文字色などを変更しています。 image:
概要
JSpinner
の代わりにJComboBox
を使用することで、アイテムの文字色などを変更しています。
Screenshot
Advertisement
サンプルコード
JButton nb = createArrowButton(SwingConstants.NORTH);
nb.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
e.setSource(comboBox);
comboBox.getActionMap().get("selectPrevious2").actionPerformed(e);
}
});
JButton sb = createArrowButton(SwingConstants.SOUTH);
sb.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
e.setSource(comboBox);
comboBox.getActionMap().get("selectNext2").actionPerformed(e);
}
});
Box box = Box.createVerticalBox();
box.add(nb);
box.add(sb);
JPanel p = new JPanel(new BorderLayout()) {
@Override public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
return new Dimension(d.width, 20);
}
};
p.add(comboBox);
p.add(box, BorderLayout.EAST);
View in GitHub: Java, Kotlin解説
上記のサンプルでは、ドロップダウンリストの表示を無効にしたJComboBox
と2
つのArrowButton
を組み合わせて、JSpinner
風のコンポーネントを作成しています。JComboBox
のセルレンダラーはHtml
タグが使用可能なので、各アイテムの文字色を<font>
タグを使って変更しています。
BasicComboBoxUI#createArrowButton()
メソッドをオーバーライドして、JComboBox
のArrowButton
を非表示に設定BasicComboBoxUI#setPopupVisible(...)
、BasicComboBoxUI#createPopup()
、BasicComboPopup#show()
メソッドなどをオーバーライドしてドロップダウンリストを無効化JComboBox#getActionMap()#get("selectNext2")
などで取得したアクションを実行するArrowButton
を作成してレイアウト- ボタンをクリックしたままの場合、値変更が繰り返し実行されるリピート機能には未対応
- 以下は、
JSpinner
のEditor
をJFormattedTextField
からJLabel
に変更する場合のサンプル
import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import java.util.Objects;
import javax.swing.*;
import javax.swing.event.*;
public class SpinnerTest {
public JComponent makeUI() {
String[] items = {
"<html><font color='red'>Sunday</font> <font color='gray'>(Sun.)",
"<html><font color='black'>Monday</font> <font color='gray'>(Mon.)",
"<html><font color='black'>Tuesday</font> <font color='gray'>(Tue.)",
"<html><font color='black'>Wednesday</font> <font color='gray'>(Wed.)",
"<html><font color='black'>Thursday</font> <font color='gray'>(Thu.)",
"<html><font color='black'>Friday</font> <font color='gray'>(Fri.)",
"<html><font color='blue'>Saturday</font> <font color='gray'>(Sat.)"
};
SpinnerListModel model = new SpinnerListModel(items);
JSpinner spinner = new JSpinner(model) {
@Override public void setEditor(JComponent editor) {
JComponent oldEditor = getEditor();
if (!editor.equals(oldEditor) && oldEditor instanceof HTMLListEditor) {
((HTMLListEditor) oldEditor).dismiss(this);
}
super.setEditor(editor);
}
};
spinner.setEditor(new HTMLListEditor(spinner));
JPanel p = new JPanel();
p.add(spinner);
return p;
}
public static void main(String... args) {
EventQueue.invokeLater(() -> {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new SpinnerTest().makeUI());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
});
}
}
class HTMLListEditor extends JLabel implements ChangeListener {
@Override public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
d.width = 200;
return d;
}
private final JSpinner spinner;
protected HTMLListEditor(JSpinner spinner) {
super();
if (!(spinner.getModel() instanceof SpinnerListModel)) {
throw new IllegalArgumentException("model not a SpinnerListModel");
}
this.spinner = spinner;
spinner.addChangeListener(this);
setText(Objects.toString(spinner.getValue()));
setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
setOpaque(true);
setBackground(Color.WHITE);
setInheritsPopupMenu(true);
String toolTipText = spinner.getToolTipText();
if (toolTipText != null) {
setToolTipText(toolTipText);
}
}
@Override public void stateChanged(ChangeEvent e) {
JSpinner spinner = (JSpinner) e.getSource();
setText(Objects.toString(spinner.getValue()));
}
public void dismiss(JSpinner spinner) {
spinner.removeChangeListener(this);
}
}
参考リンク
- JComboBoxのArrowButtonを隠す
- JTableを別コンポーネントから操作
- JComponentのKeyBinding一覧を取得する
- JButtonがマウスで押されている間、アクションを繰り返すTimerを設定する