Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从另一个类访问TrayIcon_Java_System Tray_Trayicon - Fatal编程技术网

Java 从另一个类访问TrayIcon

Java 从另一个类访问TrayIcon,java,system-tray,trayicon,Java,System Tray,Trayicon,我有两个类,在第一个WoodyGui中,我实现了GUI,将ActionListener应用于唯一的JButton,并将TrayIcon添加到SystemTray。 通过响应按钮生成的ActionEvent,我希望所有的细节都在二等WoodyEng中进行,一旦完成,我希望它在TrayIcon上显示一个通知。 但是我怎样才能从二等舱进入trayIcon?我通常收到的错误消息是: 知道我遗漏了什么吗?为什么我不能像使用JButton一样从第二个类访问TrayIcon引用变量?非常感谢你的帮助 impo

我有两个类,在第一个WoodyGui中,我实现了GUI,将ActionListener应用于唯一的JButton,并将TrayIcon添加到SystemTray。 通过响应按钮生成的ActionEvent,我希望所有的细节都在二等WoodyEng中进行,一旦完成,我希望它在TrayIcon上显示一个通知。 但是我怎样才能从二等舱进入trayIcon?我通常收到的错误消息是:

知道我遗漏了什么吗?为什么我不能像使用JButton一样从第二个类访问TrayIcon引用变量?非常感谢你的帮助

import java.awt.*;
import java.awt.event.*;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import javax.swing.*;

public class WoodyGui extends JFrame implements ActionListener {

  WoodyEng doer = new WoodyEng(this);

  JPanel area = new JPanel();
  JButton button = new JButton("GO!");

  // constructor
  public WoodyGui () {
    super("woody");
    setSize (150,200);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    button.addActionListener(doer);
    area.add(button);
    add(area);
    setVisible(true);

    if (SystemTray.isSupported()) {

    final TrayIcon trayIcon = new TrayIcon(new ImageIcon("icon.png", "").getImage(), "tray icon");
    final SystemTray tray = SystemTray.getSystemTray();

    try {
         tray.add(trayIcon);
         } catch (AWTException ex) {
                          System.out.println("TrayIcon could not be added.");
                                   }
    }
}

public static void main(String[] arguments) {
    WoodyGui pecker = new WoodyGui();
    }
}
这是第二节课:

import java.awt.event.*;
import java.awt.SystemTray;
import java.awt.TrayIcon;

  WoodyGui gui;
  Thread quack;

  public WoodyEng (WoodyGui in) {
    gui = in;
    }

  public void actionPerformed(ActionEvent eve) {
    Object who = eve.getSource();
    if (who == gui.button)
        {
        if (quack == null) {
            quack = new Thread(this);
            quack.start();
            }
        }
    }

public void run() {
    Thread thisThread = Thread.currentThread();
     while (quack == thisThread) {
     // all elaboration would occur here
     trayIcon.displayMessage("Woody","notification!!",TrayIcon.MessageType.INFO);
     if (quack != null) {
            quack = null; 
            }
     }
  }
}

我相信你发布的代码是不完整的。WoodyEng的run方法中的trayIcon变量是什么?我已将其更改为:gui.trayIcon.displayMessage。。。但我得到了同样的错误信息:-首先,WoodyEng需要实现Runnable,这样就可以调用quack=newthreadthis;和ActionListener,以便它可以处理按钮操作。此外,trayIcon仅在WoodyGui构造函数的if子句中可见。非常感谢您的见解。它的工作原理似乎是将SystemTray和TrayIcon TrayIcon声明为类变量。。。WoodyEng确实实现了Runnable,我只是忘了写下来,对不起,谢谢!
import java.awt.event.*;
import java.awt.SystemTray;
import java.awt.TrayIcon;

  WoodyGui gui;
  Thread quack;

  public WoodyEng (WoodyGui in) {
    gui = in;
    }

  public void actionPerformed(ActionEvent eve) {
    Object who = eve.getSource();
    if (who == gui.button)
        {
        if (quack == null) {
            quack = new Thread(this);
            quack.start();
            }
        }
    }

public void run() {
    Thread thisThread = Thread.currentThread();
     while (quack == thisThread) {
     // all elaboration would occur here
     trayIcon.displayMessage("Woody","notification!!",TrayIcon.MessageType.INFO);
     if (quack != null) {
            quack = null; 
            }
     }
  }
}