Probleme mit JTable

Mel_One

Erfahrenes Mitglied
Hallo,
ich hab da mal ein Problem. Ich versuche, eine JTable mit einem eigenen Model aufzubauen:

Code:
    private JTable loadTable()
    {
        JTable table = new JTable();
        Schnittstelle.Schnittstelle schnitt=new Schnittstelle.Schnittstelle();
        Vector hotel = schnitt.getHotels();
//        TableModel tabellenModel= new AbstractTableModel() {

//        };
        TableModelHotel model = new TableModelHotel(hotel);
        table.setModel(model);
        return table;
    }
, wobei das Model folgendermaßen aussieht:
Code:
package gui;
import model.*;
import java.util.Vector;
public class TableModelHotel extends javax.swing.table.DefaultTableModel {
    
    /**
     * Creates a new instance of TableModelHotel
     */

        private Vector data;
        public TableModelHotel(Vector vec)
        {
            super();
            this.setDataVector(vec);
        }
        public void setData(Vector data)
        {
            this.data=data;
        }
        public int getColumnCount() { 
            return 4;
        }
        public int getRowCount() {
            return data.size();
        }
        public Object getValueAt(int rowIndex, int columnIndex) {
            Object obj = data.get(rowIndex);
            Hotel objHotel=(Hotel)obj;
            switch(columnIndex)
            {
                case 1: return objHotel.getHotelCode();
                case 2: return objHotel.getHotelName();
                case 3: return objHotel.getCity();
                case 4: return objHotel.getNumberOfStars();
                default: return null;
            }
        }
        public Vector getDataVector() {
		return data;
	}

	public void setDataVector(Vector dataVector) {
		this.data = dataVector;
	}
        public boolean isCellEditable(int row, int col) {
		 return false;
	}
}
In der Zeile
Code:
        TableModelHotel model = new TableModelHotel(hotel);
kommt nun eine Nullpointerexception. Laut Debug wird anscheinend die Methode public int getRowCount() aufgerufen, bevor der Konstruktor anständig durchgelaufen ist, dementsprechend ist der Vector noch leer. Ich weiß jetzt nicht, ist das normal? Für Hilfe wäre ich sehr dankbar.
Greetings, Mel_One
 
Also erstmal muss ich meckern. Das ist ne wircklich miese Namensvergabe und der Fehler liegt vermutlich hier
Code:
this.data=data;
das this kann sich auf die Klasse oder den Übergabeparameter beziehen. Am besten du gewöhnst dir an Übergabeparameter z.b mit "_" zu beginnen. Dann lautet das so:
Code:
public void setData(Vector _data)
        {
            this.data = _data;
        }


Ps. Leute, wie können alle nur so fröhlich ihrer Arbeit nachgehen ohne was von einer Namenskonvension gehöhrt zu haben?
 
:-D Sorry mit den Namen, ist aktuell noch Prototyping in den ersten 2 Stunden, werd mich darum kümmern.
Die Klasse Schnittstelle ist bis jetzt nur ein Beispielstub, da kommt nachher noch ne andere Datenquelle hin:
Code:
/*
 * Schnittstelle.java
 *
 * Created on 29. Januar 2008, 08:13
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package Schnittstelle;
import java.util.Vector;
import model.Hotel;
import model.RoomType;
public class Schnittstelle {
    private Vector vec;
    /** Creates a new instance of Schnittstelle */
    public Schnittstelle() 
    {
              RoomType avantgarde = new RoomType("Avantgarde",
                                         2, true, 5000f);
      RoomType business = new RoomType("Business", 2, true, 200f);
      RoomType basic = new RoomType("Basic", 1, false, 75f);

      Hotel hotel1 = new Hotel("AX001",
                               "Axis2 Grand Hotel",
                               "München", 5, 
                               new RoomType[] { avantgarde,
                                                business,
                                                basic });

      RoomType vip = new RoomType("VIP",1, true, 2500f);
      RoomType manager = new RoomType("Manager", 1, true, 175f);
      RoomType basic4two = new RoomType("Basic4Two",2, true, 80f);

      Hotel hotel2 = new Hotel("AX010",
                               "Axis2 Plaza",
                               "Hamburg", 4,
                               new RoomType[] { vip, 
                                                manager, 
                                                basic4two });

      RoomType bettenLager = new RoomType("Bettenlager", 4, 
                                          false, 15f);
      RoomType matrazenLager = new RoomType("Matrazenlager", 6,
                                            false, 5f);

      Hotel hotel3 = new Hotel("AX050",
                               "Achsenhütte",
                               "Unterammergau", 1,
                               new RoomType[] { bettenLager,
                                                matrazenLager });
      vec = new Vector();
      vec.add(hotel1);
      vec.add(hotel2);
      vec.add(hotel3);
    }
       public Vector getHotels() {
      return vec;
   }

   public Hotel findHotel(String hotelCode) {
      for (int i = 0; i < vec.size(); i++) {
         if (((Hotel)vec.elementAt(i)).getHotelCode().equals(hotelCode))
            return (Hotel)vec.elementAt(i);
      }
      return null;
    }
}

Die Exception, die geworfen wird, ist folgende:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at gui.TableModelHotel.getRowCount(TableModelHotel.java:36)
at javax.swing.table.DefaultTableModel.setDataVector(DefaultTableModel.java:207)
at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:107)
at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:89)
at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:69)
at gui.TableModelHotel.<init>(TableModelHotel.java:25)
at gui.HotelGui.loadTable(HotelGui.java:75)
at gui.HotelGui.createAndAddStartPage(HotelGui.java:29)
at gui.HotelGui.<init>(HotelGui.java:25)
at gui.HotelGui$1.run(HotelGui.java:126)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

EDIT:
Aber trotz schlechter Namensgergabe kann das das Problem nicht sein. Der Name data bei der Übergabe verdeckt das Attribut der Klasse, während das this relativ eindeutig diese Verdeckung wieder aufhebt.
 
:-D Sorry mit den Namen, ist aktuell noch Prototyping in den ersten 2 Stunden, werd mich darum kümmern.
Du verstehst nicht, du sollst dies JETZT mal ändern, ich glaube, da könnte der Feheler liegen!
Außerdem sollte man wenn, dann gleich ordentlich vorgehen, weil man sonst später massive probleme bekommt.
 
Ist schon erledigt, und es liegt nicht daran.

EDIT:
Aber verblüffend, wenn ich, anstatt den Vector zu verwenden, einfach eine 3 zurückgebe, kommt dieselbe Exception. Sehr, sehr seltsam.
 
Zuletzt bearbeitet:
Lass dir mal gleich nach der Zeile
Code:
this.data = _data;
mal mit einem System.out.println() ausgeben, ob in this.date etwas drin steht.
 
Hm, sehr interessant

Code:
        public TableModelHotel(Vector vec)
        {
            this.setData(vec);
        }
        public void setData(Vector _data)
        {
            this.data=_data;
            System.out.println(this.data.size());
        }

Entweder ist die Konsole kaputt, oder ich kann nicht lesen, aber da scheint nichts anzukommen. :eek:

EDIT:
Ich hab jetzt auch mal einen Breakpoint in die setData gelegt, der springt auch noch nicht mal an.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück