2016-04-14 5 views
0

Новичок здесь, простите меня.Невозможно вызвать метод родительского класса из дочернего класса с помощью значка в трее

Это мой код:

Родитель/Основной/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(); 
    } 
} 

начало() метод в классе ребенок работает, но когда я пытаюсь чтобы вызвать это из actionlistener лотка, он продолжает говорить, что «статический метод start() не может ссылаться на статический контекст».

Пробовал использовать super.start() в методе actionlistener, но это тоже не сработает.

Что я пытаюсь сделать; Домашний класс - это мой JFrame и основной класс, у меня есть другой класс, который управляет значками в моем лотке, и получил несколько кнопок в лотке, которые вызывают некоторые методы из основного класса при вызове.

Любая помощь будет оценена по достоинству.

ответ

0

Если я прав, это то, где появляется ошибка:

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

     start(); 
    } 
}); 

Это, потому что выше код в статическом методе. Он не имеет ссылки на экземпляр Tray, только для класса Tray. Метод start() относится к экземпляру Tray, а не к классу. У вас должна быть ссылка для экземпляра Tray (переменная).

Там два пути для этого:

  • удалить статическое ключевое слово перед методом
    В этом случае метод ShowTrayIcon будет принадлежать к экземпляру, и мог бы назвать start метод
  • добавить Tray параметр для метода.
    В этом случае метод будет выглядеть как этот

кодекса

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

Надежда, это помогает.