JComboBoxのボタンやエディタ、ポップアップを変更する

以前、JComboBoxのポップアップの表示内容を変更する方法を考えてみました。

JComboBoxでポップアップした選択肢の表示を変更する
http://symfoware.blog68.fc2.com/blog-entry-961.html


今回はもう一歩踏み込んで、ボタンも変更してみます。




最初のサンプル



普通のコンボボックスを表示するとこんな感じ。


  1. package sample;
  2. import java.awt.BorderLayout;
  3. import java.awt.Dimension;
  4. import java.awt.EventQueue;
  5. import javax.swing.JComboBox;
  6. import javax.swing.JFrame;
  7. import javax.swing.JLabel;
  8. public class Sample {
  9.     public static void main(String[] args) {
  10.         EventQueue.invokeLater(new Runnable() {
  11.             @Override
  12.             public void run() {
  13.                 startup();
  14.             }
  15.         });
  16.     }
  17.     private static void startup() {
  18.         
  19.         // 適当にコンボボックスを作成して配置する
  20.         JComboBox combo = new JComboBox();
  21.         combo.addItem("テスト1");
  22.         combo.addItem("テスト2");
  23.         
  24.         
  25.         JFrame frame = new JFrame();
  26.         frame.setTitle("Java Version : " + System.getProperty("java.version"));
  27.         frame.getContentPane().add(combo, BorderLayout.NORTH);
  28.         frame.getContentPane().add(new JLabel("コンボボックスサンプル"), BorderLayout.CENTER);
  29.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  30.         frame.setSize(new Dimension(350, 150));
  31.         frame.setLocationRelativeTo(null);
  32.         frame.setVisible(true);
  33.     }
  34. }



125_01.png






コンボボックスのボタンを変更



色々調べてみたところ、ComboBoxUIを継承したクラスを作成すればよさそうです。

ボタンなどを変更できるか、JComboBoxを継承したMyComboBoxを作成。
UIにMetalComboBoxUIを継承したMyComboBoxUIを指定してやります。


  1. package sample;
  2. import java.awt.Color;
  3. import javax.swing.ComboBoxEditor;
  4. import javax.swing.JButton;
  5. import javax.swing.JCheckBox;
  6. import javax.swing.JComboBox;
  7. import javax.swing.JPanel;
  8. import javax.swing.JTextField;
  9. import javax.swing.ListCellRenderer;
  10. import javax.swing.plaf.ComboBoxUI;
  11. import javax.swing.plaf.basic.BasicComboBoxEditor;
  12. import javax.swing.plaf.basic.BasicComboBoxRenderer;
  13. import javax.swing.plaf.basic.BasicComboPopup;
  14. import javax.swing.plaf.basic.ComboPopup;
  15. import javax.swing.plaf.metal.MetalComboBoxUI;
  16. @SuppressWarnings("serial")
  17. public class MyComboBox extends JComboBox {
  18.     
  19.     // UIに自分が作ったMyComboBoxUIを設定する
  20.     @Override
  21.     public void setUI(ComboBoxUI ui) {
  22.         super.setUI(new MyComboBoxUI());
  23.     }
  24.     
  25.     
  26.     // --- MetalComboBoxUIを継承して作成
  27.     //BasicComboBoxUI, MetalComboBoxUI等が参考になります
  28.     private class MyComboBoxUI extends MetalComboBoxUI {
  29.         
  30.         // editable = trueの時に使用されるテキストエディタを独自のものに置き換える
  31.         protected ComboBoxEditor createEditor() {
  32.             ComboBoxEditor editor = new MyComboBoxEditor();
  33.             return editor;
  34.         }
  35.         
  36.         // リストから選択されている項目を表示するときに使用されるレンダラーを
  37.         // 独自の物に置き換える
  38.         protected ListCellRenderer createRenderer() {
  39.             return new MyComboBoxRenderer();
  40.         }
  41.         
  42.         // ボタンを押した時に使用するポップアップメニューを変更
  43.         protected ComboPopup createPopup() {
  44.             BasicComboPopup popup = new BasicComboPopup(comboBox);
  45.             popup.removeAll();
  46.             
  47.             // ポップアップの内容を書き換える
  48.             JPanel panel = new JPanel();
  49.             panel.add(new JCheckBox("チェックボックスに変えてみる"));
  50.             popup.add(panel);
  51.             
  52.             return popup;
  53.         }
  54.         // コンボボックス右側に表示されるボタン
  55.         protected JButton createArrowButton() {
  56.             return new JButton("押");
  57.         }
  58.     }
  59.     
  60.     
  61.     // --- リストから選択された項目を表示するときに使用するレンダラー
  62.     private class MyComboBoxRenderer extends BasicComboBoxRenderer {
  63.         
  64.         // ちゃんと有効になっているか確認するため、何を選んでも同じ文字列を表示してみる
  65.         @Override
  66.         public String getText() {
  67.             return "いつも同じ値";
  68.         }
  69.         
  70.     }
  71.     
  72.     
  73.     
  74.     // --- editable = trueの時に使用されるエディタ
  75.     private class MyComboBoxEditor extends BasicComboBoxEditor {
  76.         
  77.         @Override
  78.         protected JTextField createEditorComponent() {
  79.             JTextField editor = new JTextField();
  80.             editor.setForeground(Color.red);
  81.             editor.setBackground(Color.red);
  82.             editor.setEditable(true);
  83.             return editor;
  84.         }
  85.     }
  86. }





MyComboBoxを画面に表示してみます。


  1. package sample;
  2. import java.awt.BorderLayout;
  3. import java.awt.Dimension;
  4. import java.awt.EventQueue;
  5. import javax.swing.JFrame;
  6. import javax.swing.JLabel;
  7. public class Sample {
  8.     public static void main(String[] args) {
  9.         EventQueue.invokeLater(new Runnable() {
  10.             @Override
  11.             public void run() {
  12.                 startup();
  13.             }
  14.         });
  15.     }
  16.     private static void startup() {
  17.         
  18.         // 作成したMyComboBoxを表示する
  19.         MyComboBox combo = new MyComboBox();
  20.         combo.addItem("テスト1");
  21.         combo.addItem("テスト2");
  22.         
  23.         
  24.         JFrame frame = new JFrame();
  25.         frame.setTitle("Java Version : " + System.getProperty("java.version"));
  26.         frame.getContentPane().add(combo, BorderLayout.NORTH);
  27.         frame.getContentPane().add(new JLabel("コンボボックスサンプル"), BorderLayout.CENTER);
  28.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  29.         frame.setSize(new Dimension(350, 150));
  30.         frame.setLocationRelativeTo(null);
  31.         frame.setVisible(true);
  32.     }
  33. }






狙い通りの表示になりました。

125_02.png





【参考URL】

http://terai.xrea.jp/Swing/_JComboBox.html

関連記事

コメント

JComboBox

Javaも詳しいのですね。
JComboBoxの調査をしていて、このブログにたどり着きました・・。

質問なのですが、JComboBoxでドロップダウンリスト(ポップアップメニュー)を表示させた状態で、
となりに配置してあるJTextFieldにマウスクリックでフォーカス移動してようとしても、
ドロップダウンリスト(ポップアップメニュー)が閉じるだけで、フォーカス移動してくれません。

Java1.5環境では、ドロップダウンリスト(ポップアップメニュー)が閉じ、フォーカス移動も行なわれてました。
Java7でも同様な動きにしたいと思っているのですが、対処方法等ご存知でしょうか?

よろしくお願い致します。

Re: JComboBox

ごめんなさい、わからないです・・・
お役に立てず、すみません。

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
https://symfo.web.fc2.com/

PR

検索フォーム

月別アーカイブ