- PR -

java.awt.Choiceのリストをクリック以外で開く方法はありますか?

1
投稿者投稿内容
taka
常連さん
会議室デビュー日: 2003/09/22
投稿数: 46
投稿日時: 2003-12-05 14:53
Choiceリストを開きたいのですが、Choiceをクリックしないとリストが開きません。

やりたい事は、キーボードの下を押下してChoiceリストを開きたいのです。

void KeyPress_Frame(KeyEvent e){
 int keycode = e.getKeyCode();
 if(kyecode == KeyEvent.VK_DOWN) {
  //ここでChoiceリストを開きたい
 }
}
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-12-05 19:05
javax.swing.JComboBoxじゃぁ、だめなの?
だめなのであれば、JComboBoxのソース追いかければ、なにかヒントぐらいはつかめるかも。
taka
常連さん
会議室デビュー日: 2003/09/22
投稿数: 46
投稿日時: 2003-12-08 09:23
引用:

かずくんさんの書き込み (2003-12-05 19:05) より:
javax.swing.JComboBoxじゃぁ、だめなの?
だめなのであれば、JComboBoxのソース追いかければ、なにかヒントぐらいはつかめるかも。




かずくん、アドバイスありがとうございます。
そうなんです、"javax.swing.JComboBox"じゃあ、だめなのです。


かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2003-12-08 13:25
引用:

だめなのであれば、JComboBoxのソース追いかければ、なにかヒントぐらいはつかめるかも。


と書いたものの、ChoiceのAPIをあさっても、リストを開く処理を呼び出せないのでダメポですね。
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2003-12-11 17:01
こんにちは、さくらばです。

引用:

かずくんさんの書き込み (2003-12-08 13:25) より:
と書いたものの、ChoiceのAPIをあさっても、リストを開く処理を呼び出せないのでダメポですね。



Choice が使えないんだったら、作っちゃえばいいのではないでしょうか。

JComboBox は復号コンポーネントなので、これを参考にすればできると思います。
添付したサンプルは TextField と Button で作ってあり、リスト部分は PopupMenu
を使っています。

最小限の機能しかインプリしていませんが、たかだか 150 行ぐらいで同じ
ようなものを作ることができました。

コード:
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.ItemSelectable;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Enumeration;
import java.util.Vector;

public class ChoiceSample {
    private MyChoice choice;

    public ChoiceSample () throws Exception {
        Frame frame = new Frame("Test");
        frame.setBounds(100, 100, 300, 100);
        frame.setLayout(new FlowLayout());
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing() {
                System.exit(0);
            }
        });

        choice = new MyChoice();
        choice.add("ABC1234567890");
        choice.add("DEF1234567890");
        choice.add("GHI1234567890");

        choice.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent event) {
                MyChoice choice = (MyChoice)event.getSource();
                System.out.println(choice.getSelectedItem());
            }
        });
        frame.add(choice);

        Button open = new Button("Open List");
        open.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                choice.showPopup();
            }
        });
        frame.add(open);

        frame.setVisible(true);

    }

    class MyChoice extends Container implements ItemSelectable {
        private TextField field;
        private Button down;
        private PopupMenu menu;

        private Vector listeners;

        public MyChoice() {
            setLayout(new BorderLayout());
            field = new TextField();
            field.addKeyListener(new KeyAdapter() {
                public void keyPressed(KeyEvent event) {
                    if (event.getKeyCode() == KeyEvent.VK_DOWN
                        || event.getKeyCode() == KeyEvent.VK_SPACE) {
                        showList();
                    }
                }
            });
            field.setEditable(false);

            down = new Button("▼");
            down.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    showList();
                }
            });
            
            add(field, BorderLayout.CENTER);
            add(down, BorderLayout.EAST);

            menu = new PopupMenu();
            menu.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent event) {
                    fireItemEvent(event.getActionCommand());
                }
            });
            add(menu);

            listeners = new Vector();
        }

        private void fireItemEvent(String selectedText) {
            field.setText(selectedText);

            ItemEvent event = new ItemEvent(this, ItemEvent.ITEM_STATE_CHANGED, 
                                            selectedText, ItemEvent.SELECTED);
            Enumeration enu = listeners.elements();
            while(enu.hasMoreElements()) {
                ItemListener listener = (ItemListener)enu.nextElement();
                listener.itemStateChanged(event);
            }
        }

        private void showList() {
            menu.show(this, 0, getHeight());
        }

        public void add(String txt) {
            menu.add(new MenuItem(txt));
            if (menu.getItemCount() == 1) {
                field.setText(txt);
            }
        }

        public void addItemListener(ItemListener l) {
            listeners.addElement(l);
        }
        
        public Object[] getSelectedObjects() {
            return new Object[] {field.getText()};
        }

        public String getSelectedItem() {
            return field.getText();
        }

        public void removeItemListener(ItemListener l) {
            listeners.removeElement(l);
        }

        public void showPopup() {
            menu.show(this, 0, getHeight());
        }
    }

    public static void main(String[] args) throws Exception {
        new ChoiceSample();
    }
}



1

スキルアップ/キャリアアップ(JOB@IT)