Swing/SpinnerTextColor のバックアップの現在との差分(No.7)
- 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);
#spandel
nb.addActionListener(new ActionListener() {
#spanend
@Override public void actionPerformed(ActionEvent e) {
e.setSource(comboBox);
comboBox.getActionMap().get("selectPrevious2").actionPerformed(e);
}
#spanadd
nb.addActionListener(e -> {
#spanend
e.setSource(comboBox);
comboBox.getActionMap().get("selectPrevious2").actionPerformed(e);
});
#spanadd
#spanend
JButton sb = createArrowButton(SwingConstants.SOUTH);
#spandel
sb.addActionListener(new ActionListener() {
#spanend
@Override public void actionPerformed(ActionEvent e) {
e.setSource(comboBox);
comboBox.getActionMap().get("selectNext2").actionPerformed(e);
}
#spanadd
sb.addActionListener(e -> {
#spanend
e.setSource(comboBox);
comboBox.getActionMap().get("selectNext2").actionPerformed(e);
});
#spanadd
#spanend
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>
タグを使って変更しています。
上記のサンプルでは、ドロップダウンリストの表示を無効にしたJComboBox
と2
つのArrowButton
を組み合わせて、JSpinner
風のコンポーネントを作成しています。JComboBox
のデフォルトセルレンダラーはJLabel
を継承していてHtml
タグが使用可能なので、各アイテムの文字色を<font>
タグで部分的に変更しています。
-
BasicComboBoxUI#createArrowButton()
メソッドをオーバーライドして、JComboBox
のArrowButton
を非表示に設定 -
BasicComboBoxUI#createArrowButton()
メソッドをオーバーライドしてJComboBox
のArrowButton
を非表示に設定 BasicComboBoxUI#setPopupVisible(...)
、BasicComboBoxUI#createPopup()
、BasicComboPopup#show()
メソッドなどをオーバーライドしてドロップダウンリストを無効化JComboBox#getActionMap()#get("selectNext2")
などで取得したアクションを実行するArrowButton
を作成してレイアウト- ボタンをクリックしたままの場合、値変更が繰り返し実行されるリピート機能には未対応
- -
- 以下は、
JSpinner
のEditor
をJFormattedTextField
からJLabel
に変更する場合のサンプル
#spanend
#spandel
import java.awt.*;
#spanend
#spandel
import java.awt.event.*;
#spanend
#spandel
import java.beans.*;
#spanend
#spandel
import java.util.Objects;
#spanend
#spandel
import javax.swing.*;
#spanend
#spandel
import javax.swing.event.*;
#spanend
#spandel
#spanend
#spandel
public class SpinnerTest {
#spanend
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));
#spandel
#spanend
JPanel p = new JPanel();
p.add(spinner);
return p;
}
#spandel
#spanend
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);
});
}
#spandel
}
#spanend
#spandel
#spanend
#spandel
class HTMLListEditor extends JLabel implements ChangeListener {
#spanend
@Override public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
d.width = 200;
return d;
}
private final JSpinner spinner;
#spandel
#spanend
protected HTMLListEditor(JSpinner spinner) {
super();
#spandel
#spanend
if (!(spinner.getModel() instanceof SpinnerListModel)) {
throw new IllegalArgumentException("model not a SpinnerListModel");
}
this.spinner = spinner;
spinner.addChangeListener(this);
#spandel
#spanend
setText(Objects.toString(spinner.getValue()));
setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
setOpaque(true);
setBackground(Color.WHITE);
setInheritsPopupMenu(true);
#spandel
#spanend
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);
}
#spandel
}
#spanend
#spandel
参考リンク
- JComboBoxのArrowButtonを隠す
- JTableを別コンポーネントから操作
- JComponentのKeyBinding一覧を取得する
- JButtonがマウスで押されている間、アクションを繰り返すTimerを設定する
- JSpinnerのエディタをJLabelに変更してHTMLを表示する
-
JSpinner
のEditor
をJFormattedTextField
からJLabel
に変更して同様の文字色変更を行うサンプル
-