- ベストアンサー
Appletのポップアップについて
現在地図のような画像がアプレットに表示されているとして 表示されている範囲内のコンビニの印がある場所にだけポップアップ(ラベル、マーカ?)のようなものでコンビニ名(ローソン、ファミリーマート、セブンイレブン)をその印のある場所に表示したいと考えています。(コンビニの印のアプレット内での座標(とコンビニ名の対応)などはリストとして取得済みです)。 現在JPopupMenuを用いて悪戦苦闘しているのですが一度に異なる座標に、異なるポップアップというものを表示させることができていない状態です。 (*)実際の作成物は説明し難いため問題を少し異なるものにしています。 これらについて知識が御ありになる方、他の方法や参考となるソースなどありましたら教えていただけないでしょうか?よろしくお願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>一度に異なる座標に、異なるポップアップ 右クリックしたら表示でよいですか。 で、異なるpopupの設定をループでやってしまうには、配列を使うと楽になります。 以下のソースで popupをしたいオブジェクトSomeOneのfieldとしてJPopupMenu[]や、文字列、座標を保持しているとして(listの内容が不明だったので、ここでは全部単純に配列にしています) コンストラクターでsetPop()を実行しておくと、右クリックeventでpopupが複数でると思います。 実際に動作させてないので、打ち間違いはご容赦下さい。 class SomeOne extends JPanel implements ActionListener{ private JPopupMenu[] menu_list; // 右クリックメニュー用 private String[][] menu_list_str ={ {"loson1","loson2","loson3"}, {"seven1","seven2"}, {"family1","family2","family3","family4"} }; private int[] pop_x = {10,200,300}; private int[] pop_y = {110,120,130}; private void setPop(){ // popupメニュー作成 int len = menu_list_str.length; menu_list = new JPopupMenu[len]; // len個の配列作成 for(int j=0; j <len; j++ ){ menu_list[j] = new JPopupMenu(); // 各popupオブジェクト作成 for(int i=0; i <menu_list_str[j].length; i++ ){ JMenuItem item = new JMenuItem(menu_list_str[j][i]); item.addActionListener(this); // this = 載せてるクラス: popup内の項目クリック時のエベント登録 item.setActionCommand(menu_list_str[j][i]); menu_list[j].add(item); } menu_list[j].setVisible(false); // 見えなくしておく } this.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent ev) { // jdk1.4 では int getButton() で 数値比較可能 if ( ev.getButton() == 3) { // mouse button3 = 右クリック で、複数のpopup表示 int len = menu_list_str.length; for(int j=0; j <len; j++ ){ menu_list[j].show( (Component)(ev.getSource()), pop_x[j], pop_y[j] ); //↑各popup番号とx,y座標の対応がちゃんと付いていれば、listへの書き換えはできますよね。 } } } } ); } SomeOne(){ setPop(); } }
その他の回答 (1)
- PecoPlus
- ベストアンサー率76% (144/188)
こんばんは。 普通にJLableを使うのが一番簡単ではないでしょうか? たとえば、 JLabel label = new JLabel("Test"); label.setBackground(new Color(255, 255, 204)); label.setBorder(BorderFactory.createLineBorder(Color.BLACK)); label.setOpaque(true); このラベルを使うだけで、ツールチップぽいものができると思います。 背景色を変えたり、自作のBorderを使うなりすれば、自分の理想に近いものができると思います。
お礼
ご回答ありがとうございます。 ポップアップといういうことを考えすぎたかもしれません。 描写系のプログラムを作成するも数年前に簡単に学習したきりでいつの間にかSwingなどのパッケージが出てきていて右往左往している状態です。 自分の周りにはJavaを扱っている人間がほとんどいないのでアドバイスはとても参考になります。ありがとうございました。 明日にでもご意見を参考に試してみようと思います。
お礼
御回答ありがとうございます。 popupオブジェクトひとつで複数の表示をしようとしていたため 同時にいくつも出すことができなくてさっきまで困っていました。 明日、実際教えていただいたソースを元に試してみますがsetPop()は正に自分が必要としていたものだと思います。 丁寧にソースまで書いていただき本当に感謝いたします。 ありがとうございました。
補足
すみません、少し変更してソースに組み込み試させていただいたのですが menu_list[j].show( (Component)(ev.getSource()), pop_x[j], pop_y) のjの値が変わるときに前の表示されていたpopupは消えてしまうようで awtの場合右クリックを押すごとに、menu_list[0]→menu_list[1]→menu_list[2]のpopmenuが表示されてしまいます。 swingでは一瞬で入れ替わりmenu_list[2]のみが表示されてしまいます。 目標としているものは一度に複数のポップアップを表示することなので 残念ながら教えていただいたソースを参考にすることができませんでした。 色々調べてみたのですが 目的としているものはPopupMenuというよりはポップアップ(コン)テキストの部類に入るようです。 質問の補足をさせていただくと こちらのサイト ttp://www.sl-j.co.jp/applets_new/jtmsdemo/jtmsdemo.html のアイコンをクリックすると表示されるようなものを複数一度に(ボタン、もしくはワンクリック)表示させたいと考えています。 例:ボタンを押せば上のサイトの黄色の!マークのポップアップ(ウインド)がすべて開くような仕組み。 長文になってしまいましたが引き続きアイディアなどありましたら ご教授お願い致します。