• ベストアンサー

タスクトレイのメニュからウィンドウを隠す/表示する

現在ランチャーをJava 6.0で作成しています。 タスクトレイに常駐できるようTrayIconでタスクトレイにアイコンを表示させて、ウィンドウでは作成したボタンか閉じるボタンを押すことでウィンドウを不可視状態(setVisible(false);)にするようにしています。 しかし、タスクトレイのポップアップメニュにウィンドウが可視状態の時は不可視に、不可視状態の時は可視状態に切り替わるようなメニュを付けたいのですが、うまくいきません。 なにか良い方法は無いでしょうか? お願いいたしますm(_ _)m

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

  • ベストアンサー
  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.2

そもそも、JFrameオブジェクトのコンテナ(ContentPane???)だけをsetVisible(true/false)するとか、JFrameオブジェクトのコンテナがstaticオブジェクトである、というあなたのコードの状況が、完全にヘンです。通常、アプリケーションのメインのコンテナはJFrame自身であり、しかもそれはnewされて作られたオブジェクトであり、staticではありえません。--staticなコンテナは、あなたが開閉したいJFrameオブジェクトではありえない!。 ごくふつうに常識的にやれば、あなたの目的は達成されます(下のプログラムを試してみてください--全角スペースは半角スペース2個に置換してからコンパイルしてください)。ただし、これを「ランチャ」と呼ぶことは疑問です。ふつう、ランチャって、それをクリックしたらアプリケーションが起動することでは?。 ---------------------------------------------------- import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import javax.imageio.*; public class Deee{  Window win;  MenuItem house;  SystemTray systray;  Image img;  PopupMenu pmenu;  TrayIcon icon;  public void setLauncher(Window w) throws Exception{   win = w;     systray = SystemTray.getSystemTray();   img = ImageIO.read(new File("images/Icon.PNG")); // image -> images   PopupMenu pmenu = new PopupMenu("--ランチャ--");   house = new MenuItem("格納/表示");   house.addActionListener(new ActionListener(){    public void actionPerformed(ActionEvent e) {     if (e.getSource() == house){      if (win.isShowing()){       win.setVisible(false);      }      else {       win.setVisible(true);      }     }    }   });   pmenu.add(house);   icon = new TrayIcon(img, "ランチャ", pmenu);   systray.add(icon);  }  /* main() for test */  public static void main(String[] args) throws Exception{   JFrame frame = new JFrame();   frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);   frame.setBounds(200, 200, 400, 400);   frame.setVisible(true);   Deee d = new Deee();   d.setLauncher(frame);  } } ----------------------------------------------------

deee
質問者

お礼

そうですよねぇ…JFrameがstaticなのはやはりおかしいですよね・・・ おかしいとは思ったのですが、eclipseのエラーの対処(?)みたいのでそのように促されたので、わからなかったためとりあえずstaticにして、放置して他の部分を作っていました… 他の人にも相談したり考えたりした結果、私自身javaの初歩的な考えが間違っていたというか忘れていたというか…そんな感じでした^^; _ranco_さんのプログラムを参考にして、自分なりにも試行錯誤した結果、なんとかうまく動作させることが出来ました! 本当にありがとうございました! ちなみに「ランチャと呼ぶことは疑問です」とありましたが、格納と表示という動作を付けたかったので、ランチャの機能のプログラムは別部分で作成していました。

その他の回答 (1)

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.1

> うまくいきません。 うまくいかないプログラムのコード、またはその小さなひな形を投稿してください。でっかい長いコードはノー!。小さなサンプルプログラムをお願いします。

deee
質問者

お礼

遅くなって申し訳ありません。 ポップアップメニュのみで操作すると ウィンドウの中身だけ消える→中身が戻る となり、ウィンドウ→ポップアップメニュと操作すると ウィンドウが隠れる→押しても表示されない となります。 ポップアップメニュのアクションがいけないのでしょうが… class TaskTray ~ {  MenuItem house;  TaskTray() ~ {   SystemTray systray = SystemTray.getSystemTray();   Image img = ImageIO.read(new File("image/Icon.PNG"));   PopupMenu pmenu = new PopupMenu("ランチャ");   house = new MenuItem("格納/表示");   house.addActionListener(this);   pmenu.add(house);   TrayIcon icon = new TrayIcon(img, "ランチャ", pmenu);   systray.add(icon);  }  public void actionPerformed(ActionEvent e) {   if ( e.getSource() == house ) {    if ( Frame.container.isShowing() == true ) {     Frame.container.setVisible(false);    }    else if ( Frame.container.isShowing() == false ) {     Frame.container.setVisible(true);    }   }  } } class Frame extends JFrame ~ {  static Container container;  public Frame() {   コンテナやその他の設定   setDefaultCloseOperation(HIDE_ON_CLOSE);  } } 必要な所だけ書いたつもりですが、こんな感じで大丈夫でしょうか?; よろしくお願いいたします。。。