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?
HauptKLasse: MainWindow.java
Ein Tabreiter: ImageListePanel.class
Aufruf der Methode: test.initSystemTray(); im Konstruktor ganz am Ende!
Die SystemTray KLasse: MySystemTray.class
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.");
}
}
}