无法使用托盘图标

时间:2016-04-14 14:24:05

标签: java swing actionlistener trayicon

这里的新手原谅我。

这是我的代码:

父/主/ JFrame中:

public class Home extends javax.swing.JFrame {
    public Home() {
        initComponents();
        setIcon("icon"); // set the taskbar icon
    }

    public static void main(String args[]) {
        // main code here, including tray initialization
        new Home().setVisible(true);
    }

    public void start() {
        // code here
    }
}

儿童班:

public class Tray extends Home {

    static TrayIcon trayIcon;

    private static void ShowTrayIcon(String status) {

        if (!SystemTray.isSupported()) {
            System.out.println("Tray not supported");
            System.exit(0);
            return;
        }

        final PopupMenu popup = new PopupMenu();

        final SystemTray tray = SystemTray.getSystemTray();
        trayIcon = new TrayIcon(CreateIcon("/Images/off.png", "desc"));

        MenuItem StartItem = new MenuItem("Start");
        popup.add(StartItem);

        trayIcon.setPopupMenu(popup);

        // open from tray
        StartItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                start();
            }
        });

        try {
            tray.add(trayIcon);
        } catch (AWTException e) {
        }
    }

    protected static Image CreateIcon(String path, String desc) {
        URL ImageURL = Tray.class.getResource(path);
        if (ImageURL == null) {
            System.err.println("Resource not found: " + path);
            return null;
        } else {
            // System.err.println("Resource found: " + path);
            return (new ImageIcon(ImageURL, desc)).getImage();
        }
    }

    public void start() {
        super.start();
    }
}

子类中的start()方法有效,但是当我尝试从trayicon的actionlistener调用它时,它一直说'非静态方法start()不能从静态上下文中引用'。

尝试在actionlistener方法中使用super.start(),但这也不起作用。

我正在努力做什么; Home类是我的JFrame和主类,我有另一个类设置来处理我的托盘图标,并在托盘中有一些按钮,在调用时会调用主类中的一些方法。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果我是对的,这就是出现错误的地方:

StartItem.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {

         start();
    }
});

那是因为上面的代码是静态方法。它没有Tray实例的任何引用,仅适用于Tray类。 start()方法属于Tray实例,不属于该类。您应该有一个Tray实例(变量)的参考。

有两种方法:

  • 在方法
    之前删除static关键字 在这种情况下,ShowTrayIcon方法属于实例,可以调用start方法
  • 为方法添加Tray参数 在这种情况下,该方法将类似于此

代码

private static void ShowTrayIcon(String status, Tray tray) {
    // some code here
    tray.start();
}

希望,这有帮助。