重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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

何かいい方法があれば教えてください。
よろしくお願いいたします。

A 回答 (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も同様に追加削除する必要があるかもしれません.
    • good
    • 0
この回答へのお礼

遅くなりました、回答ありがとうございます。

>かなり力技ですが最終手段として考えてください.
>考え方はこうです.

了解です、最終手段として考えます。

お礼日時:2007/07/02 13:34

失礼しました。


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

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

お礼日時:2007/06/26 20:41

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


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

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

お礼日時:2007/06/26 13:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!