Hallo,
ich setzte mich gerade zum ersten Mal mit swing und JTables auseinander und bin natürlich prompt auf ein Problem gestossen das mich schier zur Verzweiflung treibt und zwar möchte ich als Einstiegsübung eine Tabelle erzeugen, die in einem Fenster angezeigt wird und deren Zellen mit den Elementen eines zweidimensionalen Arrays vom Typ boolean verknüpft sind. Zu Beginn sind alle Elemente des Arrays mit false initialisiert. Durch einen Mausklick auf eine Zelle soll sich der entsprechende Wert des Arrays jedoch auf true ändern und gleichzeitig die Hintergrundfarbe der Zelle von weiß auf schwarz wechseln. Das Aussehen der Tabelle habe ich soweit auch hingekriegt, doch bei der MouseListener funktioniert leider nicht wie gewünscht, sondern produziert eine java.lang.NullPointerException. Ich probiere jetzt schon seit Stunden daran herum und komme einfach nicht weiter...
Auf die Gefahr hin mich zu blamieren poste ich hier mal meinen Code und hoffe das mir ein freundlicher Mensch weiter helfen kann:
Das ist also mein Code und dazu habe ich zwei Fragen:
1. Was mache ich mit dem MouseListener falsch?
2. Wie aktualisiere ich das Fenster, wenn das mit dem Mausklick klappen würde? Mit einem fireTableCellUpdated?
Vielen Dank im voraus,
der Neue
ich setzte mich gerade zum ersten Mal mit swing und JTables auseinander und bin natürlich prompt auf ein Problem gestossen das mich schier zur Verzweiflung treibt und zwar möchte ich als Einstiegsübung eine Tabelle erzeugen, die in einem Fenster angezeigt wird und deren Zellen mit den Elementen eines zweidimensionalen Arrays vom Typ boolean verknüpft sind. Zu Beginn sind alle Elemente des Arrays mit false initialisiert. Durch einen Mausklick auf eine Zelle soll sich der entsprechende Wert des Arrays jedoch auf true ändern und gleichzeitig die Hintergrundfarbe der Zelle von weiß auf schwarz wechseln. Das Aussehen der Tabelle habe ich soweit auch hingekriegt, doch bei der MouseListener funktioniert leider nicht wie gewünscht, sondern produziert eine java.lang.NullPointerException. Ich probiere jetzt schon seit Stunden daran herum und komme einfach nicht weiter...
Auf die Gefahr hin mich zu blamieren poste ich hier mal meinen Code und hoffe das mir ein freundlicher Mensch weiter helfen kann:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class TestTabelle extends JFrame
{//class TestTabelle
public TestTabelle()
{//TestTabelle()
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTable tabelle=new JTable(new TestTabMod());
JFrame fenster=new JFrame();
tabelle.setDefaultRenderer(Object.class, new TestZellRenderer());
//tabelle.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
tabelle.setRowHeight(20);
tabelle.addMouseListener(new MouseAdapter()
{
JTable tabelle;
public void mouseClicked(MouseEvent me)
{
int reihe=tabelle.rowAtPoint(me.getPoint());
int spalte=tabelle.columnAtPoint(me.getPoint());
Object wert=tabelle.getValueAt(reihe, spalte);
if((Boolean)wert==false)
{
tabelle.setValueAt(true, reihe, spalte);
}
else
{
tabelle.setValueAt(false, reihe, spalte);
}
}
});
JPanel panel=new JPanel();
panel.add(tabelle);
fenster.add(panel);
fenster.add(tabelle);
fenster.setSize(400, 430);
fenster.setVisible(true);
add(panel, BorderLayout.CENTER);
pack();
}//TestTabelle()
private class TestTabMod extends AbstractTableModel
{//class TestTabMod
private boolean[][]rasterFeld=new boolean[20][20];
public TestTabMod()
{
for (int i = 0; i < rasterFeld.length; i++)
{
for (int j = 0; j < rasterFeld[i].length; j++)
{
rasterFeld[i][j] = new Boolean(false);
}
}
}
public int getColumnCount()
{
return rasterFeld[0].length;
}
public int getRowCount()
{
return rasterFeld.length;
}
public Object getValueAt(int rowIndex, int columnIndex)
{
return rasterFeld[rowIndex][columnIndex];
}
public void setValueAt(Object value, int rowIndex, int columnIndex)
{
rasterFeld[rowIndex][columnIndex]=(Boolean)value;
}
}//class TestTabMod
private class TestZellRenderer extends JLabel implements TableCellRenderer
{//class TestZellRenderer
private Color black=new Color(0, 0, 0);
private Color white=new Color(255, 255, 255);
public TestZellRenderer()
{
setOpaque(true);
}
public Component getTableCellRendererComponent(JTable tabelle, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
Boolean rasterFeld=(Boolean)value;
if (rasterFeld.booleanValue())
{
setBackground(black);
}
else
{
setBackground(white);
}
return this;
}
}//class TestZellRenderer
public static void main(String[]args)
{//main
new TestTabelle();
}//main
}//class TestTabelle
Das ist also mein Code und dazu habe ich zwei Fragen:
1. Was mache ich mit dem MouseListener falsch?
2. Wie aktualisiere ich das Fenster, wenn das mit dem Mausklick klappen würde? Mit einem fireTableCellUpdated?
Vielen Dank im voraus,
der Neue