• ベストアンサー

JComboBoxをsetEnabled以外でロックしたい

表題のとおり、JComboBoxをsetEnabled以外でロックしたいのですがいい方法が見つかりません。 処理によってはJComboBoxを表示だけで使いたいのです。 setEditable(false)や、setFocusable(false)をしても操作できてしまいます。setEnabled(false)ではロックできるのですが、かなり見た目が薄くなります。 何かいい方法があれば教えてください。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • xpector
  • ベストアンサー率75% (3/4)
回答No.3

かなり力技ですが最終手段として考えてください. 考え方はこうです. [編集無効時] 編集に関わりそうなマウスリスナを片っ端から除去 [編集有効時] 先ほど除去したものを再登録 そうすればクリックしてもポップアップメニューのようなものは出てこなくなります. 以下サンプルソースになります. public class CreateImageTest extends JFrame {  MyComboBox combo;  JButton button;  CreateImageTest() {   getContentPane().setLayout(new GridLayout(1,2));   getContentPane().add(combo = new MyComboBox());   combo.addItem("aaa");   combo.addItem("bbb");   getContentPane().add(button = new JButton("Click Me"));   button.addActionListener(new ActionListener() {    public void actionPerformed(ActionEvent arg0) {     combo.setMyEditable( ! combo.isMyEditable() );    }   });  }  public static void main(String[] args) {   new CreateImageTest().setVisible(true);  } } class MyComboBox extends JComboBox {  boolean editable = false;  List<MouseListener> mouseListenerList = new ArrayList<MouseListener>();  public void setMyEditable(boolean editable)  {   if (editable) {    if (! mouseListenerList.isEmpty()) {     addMouseListener(mouseListenerList.remove(0));   getComponent(0).addMouseListener(mouseListenerList.remove(0));      getComponent(0).addMouseListener(mouseListenerList.remove(0)); }    } else {     // 1個     for (MouseListener ml : getMouseListeners()) {      mouseListenerList.add(ml);      removeMouseListener(ml);     }     // 0番目のComponentに2個     for (Component c : getComponents()) {      for (MouseListener ml : c.getMouseListeners()) {       mouseListenerList.add(ml);       c.removeMouseListener(ml);      }     }    }    this.editable = editable;   }   public boolean isMyEditable() {    return editable;   } } 右側のボタンを押す度に編集モード・編集負荷モードに切り替えるというものです. 場合によってはMouseMotionListenerも同様に追加削除する必要があるかもしれません.

akiras
質問者

お礼

遅くなりました、回答ありがとうございます。 >かなり力技ですが最終手段として考えてください. >考え方はこうです. 了解です、最終手段として考えます。

その他の回答 (2)

回答No.2

失礼しました。 もしかしたら↓が参考になるかもしれません。 http://blog.goo.ne.jp/akubi_2005/e/17ab58aad2d7fae838d07fca933f2a9b どうやらメソッド呼び出し1つで設定できるものではないようです。

akiras
質問者

お礼

ありがとうございます、ちょっと見たのですが奥が深そうなので後日じっくり参考にさせていただきます。

回答No.1

>JComboBoxをsetEnabled以外でロックしたい というのが、 使用不可能にしたいけど、setEnabledだと色が変わってしまうからsetEnabled以外で というのであれば、 setEnabled(false)して、あとは見た目の色を使用可能時の色と同じにする。 というのでどうでしょうか? swingは詳しくないですけど、setBackgroundやsetForegroundで背景色や前景色を設定できます。 何を設定していいかわからなければ、使用可能時のコンポーネントからgetBackground、getForegroundしてみて同じのを設定すれば良いと思います。

akiras
質問者

お礼

回答ありがとうございます。 早速実験したのですが、setEnabled(false)のあとにsetBackgroundやsetForegroundを実行しても効き目はありませんでした。 setEnabled(false)を避けるのは、かなり薄くなってしまうので使われる人にわかりずらいかなっということが理由です。

関連するQ&A