NullPointerException bei Methodenaufruf

pel

Grünschnabel
Hallo,

ich bin gerade dabei mein SystemTrayIcon in eine eigene Klasse auszulagern der Übersichtlichkeit wegen etc... nun bekomme ich folgende Fehlermeldung, wenn ich die Methode: test.initSystemTray() in dem Konstruktor der Klasse ImageListePanel aufrufe.

Irgendenwas stimmt mit den Instanzvariablen nicht... nur wo zeigen sie falsch hin?

Code:
Exception in thread "main" java.lang.NullPointerException
	at ImageListePanel.<init>(ImageListePanel.java:229)
	at MainWindow.<init>(MainWindow.java:21)
	at MainWindow.main(MainWindow.java:80)

HauptKLasse: MainWindow.java

Code:
public class MainWindow extends JFrame
{   
	static final long serialVersionUID = 1L;
	MySystemTray test;
    public MainWindow() throws AWTException {
        
    	super("Rembo Image Lister");
		ImageListePanel  IL = new ImageListePanel(this);
        SettingsPanel SP = new SettingsPanel();       
       
        //IL.setSP(SP);
        SP.setIL(IL); 
        JTabbedPane jtp = new JTabbedPane();
        jtp.addTab("<html><font size=5>Image-Liste</font size></html>", IL);
        jtp.addTab("<html><font size=5>Image-Verwaltung</font size></html>", SP);
        add(jtp);
    }
    
    class Listener implements WindowListener
    {
	  public void windowActivated(WindowEvent arg0)
      {}
      public void windowClosed(WindowEvent arg0)
      {}
      public void windowClosing(WindowEvent arg0)
      {  
    	  int n = JOptionPane.showConfirmDialog(null,"Möchten Sie Ihre Daten noch speichern?","Alles klar?",JOptionPane.YES_NO_OPTION);
	        
    	  if (n == 0)//YES
	      {
	        	System.out.println("speichern!");
	        	
	      }
	      if (n == 1)//NO
	      {
	    	  System.out.println("beenden");//return;
	      } 
    	  
	      arg0.getWindow().setVisible(false);
	      
      }
      public void windowDeactivated(WindowEvent arg0)
      {}
      public void windowDeiconified(WindowEvent arg0)
      {}
      public void windowIconified(WindowEvent arg0)
      {} 
      public void windowOpened(WindowEvent arg0)
      {}     
    } 
    
    public static void main(String args[]) throws AWTException
    {
        try
        {            
            //UIManager.put("Label.foreground",new Color(0,140,222));
            JFrame.setDefaultLookAndFeelDecorated(true); 
            UIDefaults defaults = UIManager.getDefaults();
            Font arial = new Font("Arial", 0, 11);          
            defaults.put("Button.font", arial);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        
        MainWindow myWindow = new MainWindow();
        myWindow.setSize(1000,720);
        myWindow.setLocationRelativeTo(null);        
        myWindow.setResizable(false);
        myWindow.setVisible(false);  
        myWindow.setIconImage(new ImageIcon("images/applicationicon.png").getImage());
        myWindow.addWindowListener(myWindow.new Listener()); 
        
    } 
}

Ein Tabreiter: ImageListePanel.class


Aufruf der Methode: test.initSystemTray(); im Konstruktor ganz am Ende!

Code:
public class ImageListePanel extends JPanel implements ActionListener , ListSelectionListener
{
   
	static final long serialVersionUID = 1L;
   
	private SettingsPanel settings;
          
    private JButton loadListBT = new JButton("Liste öffnen");
    private JButton saveListBT = new JButton("Liste speichern");
    private JButton newListBT  = new JButton("Liste neu");	
    private JButton addRowBT		= new JButton();
    private JButton delRowBT		= new JButton(); 
    private JButton textcolorBT	= new JButton(); 
    
    private DefaultListModel listModel = new DefaultListModel();
    private JList liste = new JList(listModel);
    private JScrollPane listbereich = new JScrollPane(liste);
    private String[] spaltennamen = {"Status" , "Aufgabentyp" , "Aufgabe" , "Datenträger" };
    private String[][] tabellendaten = new String [700][4];
   
    JComboBox mycombobox = new JComboBox();
    
    ColorRenderer colorRenderer;
    DefaultTableModel dm;
    JTable tabelle;    
    MainWindow myWindow;
    MySystemTray test;
    
    
    public ImageListePanel(MainWindow mainWindow) throws AWTException
    {
       
    	setLayout(null);
        myWindow = mainWindow;
        add(loadListBT);
        add(saveListBT); 
        add(newListBT);
        add(listbereich);
        add(addRowBT);
        add(delRowBT);   
        add(textcolorBT);
        add(mycombobox);
        
		mycombobox.setBounds(826,341,81,40);
        
		listbereich.setBounds(826,0,160,340);
        loadListBT.setBounds(826,468,158,60);
        saveListBT.setBounds(826,529,158,60); 
        newListBT.setBounds(826,590,158,60);
        
        addRowBT.setBounds(826,381,40,40);
        delRowBT.setBounds(867,381,40,40);
        textcolorBT.setBounds(908,341,77,40);
        
        loadListBT.setIcon(new ImageIcon("images/ladeliste.png"));
        saveListBT.setIcon(new ImageIcon("images/speichereliste.png")); 
        newListBT.setIcon(new ImageIcon("images/neueListe.png"));
        addRowBT.setIcon(new ImageIcon("images/add.row.png"));
        delRowBT.setIcon(new ImageIcon("images/delete.row.png"));
        textcolorBT.setIcon(new ImageIcon("images/textcolor.png")); 
        
        saveListBT.setMargin(new Insets(0,0,0,0));   
	
              
        dm = new DefaultTableModel(tabellendaten,spaltennamen){
        	   //@Override
        	   public boolean isCellEditable(int row, int column){
        	      /*if (column == 0)return false; //oder andere Bedingungen...
        	      else return true;*/
        		   return true;
        	   }
        	};
        tabelle = new JTable( dm ){
        	
			private static final long serialVersionUID = 1L; 
					Class[] types = new Class [] {        			
                    Boolean.class, String.class, String.class, String.class
                };
            @SuppressWarnings("unchecked")
			public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
            
        	public JComponent prepareRenderer(TableCellRenderer renderer, int rowIndex, int vColIndex)
        	{
				JComponent c = (JComponent) super.prepareRenderer(renderer, rowIndex, vColIndex);
				if(isRowSelected(rowIndex))
				{
					return c; 
				}					
				colorRenderer.setBackground(c, rowIndex, vColIndex);
				
				return c; 
				
			}
		};
		colorRenderer = new ColorRenderer( tabelle ); 
		
		/*DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
        renderer.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);         
        tabelle.getColumnModel().getColumn(0).setCellRenderer(renderer);*/	
		
		/*
		 * 		Einstellungen für die JComboBox mit Farbauswahl
		 */
		
			Color gruen = new Color(0,155,0);
			Color rot = new Color(255,0,0);
			Color blau = new Color(30,144,255);
			
			mycombobox.addItem(gruen);
			mycombobox.addItem(rot);
			mycombobox.addItem(blau);		
			mycombobox.setRenderer(new ColorComboBoxRenderer());	
		
		/*
         * 		Einstellungen für die JScrollPane und TableRowHeader
         */
		
        JScrollPane scrollPane = new JScrollPane( tabelle );
        add(scrollPane);
        scrollPane.setBounds(0,0,826,650);
        scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scrollPane.setRowHeader( new TableRowHeader( tabelle, scrollPane ) );
       
        /*
         *		Einstellungen für die JTable 
         */ 
        
        tabelle.setRowSelectionAllowed(true);		
		tabelle.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		tabelle.setRowHeight(25);         
        tabelle.setAutoCreateRowSorter(true);   
        
        /*
         * 		Renderer und Editor für JComboBoxen in der JTable
         */
       
        String[] values = new String[]{"Update", "Entfernen", "Programm"};
        int vColIndex = 1;
        TableColumn col = tabelle.getColumnModel().getColumn(vColIndex);  
        col.setCellEditor(new MyComboBoxEditor(values));
        col.setCellRenderer(new MyComboBoxRenderer(values));
       
        /*
         * 		Einstellungen für die JList mit Imageauswahl
         */ 
        
        listbereich.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        listbereich.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        liste.setCellRenderer(new Renderer());        
        
        listModel.addElement("MPG 125");
        
        
        /*
         * 		Listener für JButton , JCombobox, JList etc...
         */
        
        addRowBT.addActionListener(this);
        delRowBT.addActionListener(this);
        textcolorBT.addActionListener(this);
        loadListBT.addActionListener(this);
        saveListBT.addActionListener(this);  
        mycombobox.addActionListener(this);
        liste.addListSelectionListener((ListSelectionListener) this);
        
        /*
         * 		Methoden die beim Programmstart aufgerufen werden
         */
        
        setColumnWidth();
        dm.setRowCount(30);
        
        test.initSystemTray();
    }	
        
    /*
     * --------------------------- Konstruktor Ende ---------------------------------------- * 
     */     
    public void testCheckBoxStatus()
    {
    	 boolean checkFailed = false;
    	
    	 for(int i=0 ; i < dm.getRowCount(); i++)
         {        	
    		Boolean statusCB = (Boolean)dm.getValueAt(i,1);
    		 
    		if(Boolean.FALSE.equals(statusCB))
    		{
    			//cell einfärben
    			checkFailed = true;
    			colorRenderer.setCellColor(i,1, Color.YELLOW);
    		}     		
         } 
    	 JOptionPane.showMessageDialog(this,"Es wurde nicht alle Aufgaben abgehakt!");    	 
    }  
    
    
    
    
    
    
    
    
    
    
    
    public void setSP(SettingsPanel object) {
        this.settings = object;
    }
    public void valueChanged( ListSelectionEvent e )
    {
    	
    	if(!e.getValueIsAdjusting())
        {
    		
        }
    }
    public void setColumnWidth()
    {
        tabelle.getColumnModel().getColumn(0).setPreferredWidth(20);
        tabelle.getColumnModel().getColumn(1).setPreferredWidth(80);
        tabelle.getColumnModel().getColumn(2).setPreferredWidth(500);
        tabelle.getColumnModel().getColumn(3).setPreferredWidth(100);
    }
    
    public void actionPerformed(final ActionEvent e)
    {
        
        if(e.getSource().equals( addRowBT))
        {      	
        	int a = tabelle.getSelectedRow()+1;
        	dm.insertRow(a, new Object[]{});  
        	       
        }
        
        if(e.getSource().equals( delRowBT))
        {      	
        	if(tabelle.getSelectedRow() == -1)
        	{        		
        	}
        	else
        	{
        		int a = tabelle.getSelectedRow();
        		dm.removeRow(a);
        	}	
        }
        
        if(e.getSource().equals(textcolorBT))
        {
        	           
        }	        
        
        if(e.getSource().equals(loadListBT))
        {
        	            
        }
        
        if(e.getSource().equals(saveListBT))
        {
        	 testCheckBoxStatus();           
        }
     }      
}

Die SystemTray KLasse: MySystemTray.class

Code:
public class MySystemTray
{
	
	 MainWindow myWindow;
	 TrayIcon trayIcon = null;
     PopupMenu popup = new PopupMenu();
     MenuItem anzeigenMI = new MenuItem("Programmfenster anzeigen");
     MenuItem exitMI = new MenuItem("Programm beenden");
	    
	public MySystemTray(MainWindow mainWindow)  
	{
		myWindow = mainWindow; 
	        
        	
	}
	
	public void initSystemTray() throws AWTException
	{
		if (SystemTray.isSupported())
        {
    		SystemTray tray = SystemTray.getSystemTray();
            Image image = Toolkit.getDefaultToolkit().getImage("refresh.png");
            final Image updatedImage = Toolkit.getDefaultToolkit().getImage("dir.png");   
            
            popup.add(anzeigenMI);
            popup.add(exitMI);
            
            trayIcon = new TrayIcon(image, "Tray Demo", popup);
            tray.add(trayIcon);
            trayIcon.setImageAutoSize(true);
            
            
            ActionListener anzeigenListener = new ActionListener() {
                public void actionPerformed(ActionEvent e)
                {
                	if (e.getSource().equals(anzeigenMI))
            	    { 
                    	System.out.println("Das Programmfenster wird angezeigt!");
                    	myWindow.setVisible(true);
                    	trayIcon.displayMessage("Action Event","hallo!",TrayIcon.MessageType.INFO);
                    	
                    	trayIcon.setImage(updatedImage); // wenn ein update zu machen ist sollte ein animiertes Gif mit ausrufezeichen blinken
                    	trayIcon.setToolTip("Hallo");
                    }	
                }
            };
            
            ActionListener exitListener = new ActionListener() {
                public void actionPerformed(ActionEvent e)
                {
                	     System.exit(0);
                }
            };     
            
            anzeigenMI.addActionListener(anzeigenListener);
            exitMI.addActionListener(exitListener);
            //trayIcon.addActionListener(actionListener);
            
        }
        else 
        {
            System.err.println("System tray is currently not supported.");
        } 
	}
	
}
 
Hallo,

wenn ich mich nicht verschaut hab, liegt es daran, dass test bei dir null ist. Du legst zwar eine Variable an mit
Code:
MySystemTray test
, aber es wird nirgends ein Object angelegt.

MFG

zEriX
 
I habe in der ImageListPanel.class Datei folgendes erweitert.
Code:
MySystemTray test = new MySystemTray(myWindow);

Das Programm startet sprich das TrayIcon wird unten angezeigt. Möchte ich das Programm aus der SystemTray starten mit Programmfenster anzeigen, da es vorher auf
Code:
myWindow.setVisible(false)
gesetzt ist, dann bekomme ich wieder eine NUllPointerException:

Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at MySystemTray$1.actionPerformed(MySystemTray.java:49)

Setzte ich das myWindow auf setVisible(true) von Anfang an, wird das Programmfenster auch angezeigt doch wenn ich nochmals auf "Programmfenster anzeigen" im popupmenu klicke bekomme ich wieder eine NPExeption:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at MySystemTray$1.actionPerformed(MySystemTray.java:49)

Doch ist möchte ich eh nicht sprich das Fenster MUSS unsichtbar sein, da es im Hintergrund eine Überprüfung von der soll der user erst was mitbekommen, wenn das ergebnis positiv ist.
 
Das myWindow was du übergibst ist auch null, wenn du es übergibst. Deshalb kommt auch die NullPointerException.

MFG

zEriX
 
ja aber ich kann doch net so schreiben:

MainWindow myWindow = new MainWindow(); <-- Die instanz wurde ja schon in der MainWindow bzw. der static method main erstellt


2. IL.setSP(myWindowIstNichtbekanntHier); könnte ich in die MainWindow oben in Konstruktor schreiben. und das myWindow... Objekt übergeben an die Klasse ImagesListPanel:

public void setSP(MainWindow mainWindow)
{
myWindow = mainWindow;
}

dann könnte ich auch das myWindow benutzen, doch IL.setSP(...) geht nicht
 
Schreib einfach das in den Konstruktor des MainWindow.

Code:
test = new MySystemTray(this);

Dann kannst du den Code so verwenden wie er am anfang war.

MFG

zEriX
 
so gemacht und geht nicht egal, ich habs jetzt raus auch wenn ichs nur halben blicke...

MySystemTray test = new MySystemTray(this); im Klassenvariablenbereich erstellt

test.initSystemTray(); im KOnstruktor aufgerufen

beides in der Klasse MainWindow dann gehts super , danke für deine Hilfe
 
Ich weiß ja nicht wie du es in den Konstruktor geschrieben hast, aber normal müsste es funktionieren.

MFG

zEriX
 
Zurück