2013-04-10 1 views
0

В настоящее время я создаю или пытаюсь создать графический интерфейс для моего проекта. Теперь мне нужно сделать JTable, который считывает данные из LinkedList. Для этого у меня есть пользовательский метод TableAbstractModel.GUI Не работает с пользовательским AbstractTableModel. Ошибки «Неизвестный источник»

public class StudentTableModel extends AbstractTableModel { 

public static final String[] columnNames = { "ID", "First Name", 
     "Last Name" }; 
private LinkedList<Student> data; 

public StudentTableModel(LinkedList<Student> data) { 
    this.data = data; 
} 

@Override 
public int getColumnCount() { 
    return columnNames.length; 
} 

@Override 
public String getColumnName(int column) { 
    return columnNames[column]; 
} 

@Override 
public int getRowCount() { 
    return data.size(); 
} 

@Override 
public Object getValueAt(int rowIndex, int columnIndex) { 
    Student student = data.get(rowIndex); 
    if (student == null) { 
     return null; 
    } 
    switch (columnIndex) { 
    case 0: 
     return student.getID(); 
    case 1: 
     return student.getFirstname(); 
    case 2: 
     return student.getLastname(); 
    default: 
     return null; 
    } 
} 

}

Теперь я пытаюсь построить очень простой макет, состоящий только из таблицы, а соответствующее JTextFields и JButtons, чтобы проверить, если таблица на самом деле работает.

public class GUI extends JFrame { 

private JTextField StudentID; 
private JTextField Firstname; 
private JTextField Lastname; 
private JTextField Group; 
private JButton Add; 
private static Database DB; // << Does this have to be static? Eclipse tells me it needs to be, but I am not sure. 
private JTable StudentTable; 

public GUI(Database DB) { 
    super("Theatre Management"); 
    setExtendedState(JFrame.MAXIMIZED_BOTH); 
    this.DB = DB; 
    LinkedList<Student> data = null; 

    setLayout(new FlowLayout()); 
    StudentID = new JTextField("Enter Student ID", 10); 
    Firstname = new JTextField("Enter First Name"); 
    Lastname = new JTextField("Enter Last Name"); 
    Group = new JTextField("Enter Group ID"); 
    Add = new JButton("Add Student"); 
    StudentTable = new JTable(); 
    StudentTable.setModel(new StudentTableModel(data)); 
    JScrollPane scrollPane = new JScrollPane(StudentTable); 
    StudentTable.setFillsViewportHeight(true); 

    add(StudentTable); 
    add(StudentID); 
    add(Firstname); 
    add(Lastname); 
    add(Group); 
    add(Add); 
    add(scrollPane); 

    addStudentEvent add = new addStudentEvent(); 
    Add.addActionListener(add); 

} 

public static void createAndShow() { 
    GUI Database = new GUI(DB); 
    Database.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    Database.setVisible(true); 

} 

public static void main(String[] args) { 
    GUI.createAndShow(); 

} 

private class addStudentEvent implements ActionListener { 
    public void actionPerformed(ActionEvent event) { 
     int G = Integer.parseInt(Group.getText()); 
     int ID = Integer.parseInt(StudentID.getText()); 
     String First = Firstname.getText(); 
     String Last = Lastname.getText(); 

     DB.getGroup(G).addStudent(ID, First, Last); 
     DB.addStudent(ID, First, Last); 
    } 

} 

}

Теперь проблема, как только я пытаюсь запустить GUI, я просто получить целую кучу ошибок.

Exception in thread "main" java.lang.NullPointerException 
at theatremanagement.StudentTableModel.getRowCount(StudentTableModel.java:29) 
at javax.swing.JTable.getRowCount(Unknown Source) 
at javax.swing.plaf.basic.BasicTableUI.createTableSize(Unknown Source) 
at javax.swing.plaf.basic.BasicTableUI.getPreferredSize(Unknown Source) 
at javax.swing.JComponent.getPreferredSize(Unknown Source) 
at java.awt.FlowLayout.layoutContainer(Unknown Source) 
at java.awt.Container.layout(Unknown Source) 
at java.awt.Container.doLayout(Unknown Source) 
at java.awt.Container.validateTree(Unknown Source) 
at java.awt.Container.validateTree(Unknown Source) 
at java.awt.Container.validateTree(Unknown Source) 
at java.awt.Container.validateTree(Unknown Source) 
at java.awt.Container.validate(Unknown Source) 
at java.awt.Container.validateUnconditionally(Unknown Source) 
at java.awt.Window.show(Unknown Source) 
at java.awt.Component.show(Unknown Source) 
at java.awt.Component.setVisible(Unknown Source) 
at java.awt.Window.setVisible(Unknown Source) 
at theatremanagement.GUI.createAndShow(GUI.java:59) 
at theatremanagement.GUI.main(GUI.java:64) 

Я действительно застрял прямо сейчас и понятия не имею, как это исправить. Если кто-нибудь может показать мне, что я делаю неправильно, это было бы здорово. С другой стороны, мне нужно LinkedList в моей программе, в разных классах. Как TableModel знает, какой из них я хочу? Нужно ли добавлять что-либо в TableModel, чтобы автоматически обновлять таблицу сразу после добавления или удаления ученика?

Update:

private JTable setStudentList(LinkedList<Student> Studentlist) { 
    JTable StudentTable = new JTable(); 
    StudentTable.setModel(new StudentTableModel(Studentlist)); 
    JScrollPane scrollPane = new JScrollPane(StudentTable); 
    StudentTable.setFillsViewportHeight(true); 
    return StudentTable; 

ли этот метод работы, чтобы создать таблицу с связанного списка? Разве я тогда призыв к методу,

setStudentList(Studentlist); 

Если я инициализирован пустой LinkedList как таковой:

LinkedList<Student> StudentList = new LinkedList<Student>(); 

Спасибо за помощь.

ответ

3

LinkedList никогда не initalised ...

LinkedList<Student> data = null; 
// ... /// 
StudentTable.setModel(new StudentTableModel(data)); 

Это означает, что, когда getRowCount называется, то data объект null, следовательно NullPointerException

Обновлено

У вас есть любое количество опций, которые вы можете использовать для передачи ссылки на главный LinkedList в Пользовательский интерфейс, но это будет связано с тем, как работает ваш рабочий поток.

Вы могли бы ...

Передайте ссылку на интерфейс через его конструктор ....

public GUI(Database DB, LinkedList<Student> students) {...} 

Вы могли бы ...

Пропустите LinkedList в через метод в вы GUI класс ...

public class GUI extends JFrame { 

    //...// 

    public GUI(Database DB) {...} 

    pubic void setStudent(LinkedList<Student> students) { 
     StudentTable.setModel(new StudentTableModel(students)); 
    } 
} 

Обновлены например

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.LinkedList; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.AbstractTableModel; 

public class PassTable { 

    public static void main(String[] args) { 
     new PassTable(); 
    } 

    public PassTable() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 

     }); 
    } 

    public class TestPane extends JPanel { 

     private ExampleTable example; 

     public TestPane() { 
      setLayout(new BorderLayout()); 
      example = new ExampleTable(); 
      add(example); 
      JButton add = new JButton("Add"); 
      add(add, BorderLayout.SOUTH); 
      add.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        LinkedList<Person> people = new LinkedList<Person>(); 
        people.add(new Person("A", "A", 1)); 
        people.add(new Person("B", "B", 2)); 
        people.add(new Person("C", "C", 3)); 
        people.add(new Person("D", "D", 4)); 
        example.setPeople(people); 
       } 
      }); 
     } 

    } 

    public class ExampleTable extends JPanel { 

     private JTable table; 

     public ExampleTable() { 
      this(new LinkedList<Person>()); 
     } 

     public ExampleTable(LinkedList<Person> people) { 
      setLayout(new BorderLayout()); 
      table = new JTable(new SampleTableModel(people)); 
      add(new JScrollPane(table)); 
     } 

     public void setPeople(LinkedList<Person> people) { 
      table.setModel(new SampleTableModel(people)); 
     } 

    } 

    public class SampleTableModel extends AbstractTableModel { 

     private LinkedList<Person> data; 

     public SampleTableModel(LinkedList<Person> data) { 
      this.data = data; 
     } 

     @Override 
     public int getRowCount() { 
      return data.size(); 
     } 

     @Override 
     public String getColumnName(int column) { 
      String name = ""; 
      switch (column) { 
       case 0: 
        name = "First name"; 
        break; 
       case 1: 
        name = "Last name"; 
        break; 
       case 2: 
        name = "Age"; 
        break; 
      } 
      return name; 
     } 

     @Override 
     public int getColumnCount() { 
      return 3; 
     } 

     @Override 
     public Object getValueAt(int rowIndex, int columnIndex) { 
      Object value = null; 
      Person person = data.get(rowIndex); 
      switch (columnIndex) { 
       case 0: 
        value = person.getFirstName(); 
        break; 
       case 1: 
        value = person.getLastName(); 
        break; 
       case 2: 
        value = person.getAge(); 
        break; 
      } 
      return value; 
     } 

    } 

    public class Person { 
     private String firstName; 
     private String lastName; 
     private int age; 

     public Person(String firstName, String lastName, int age) { 
      this.firstName = firstName; 
      this.lastName = lastName; 
      this.age = age; 
     } 

     public int getAge() { 
      return age; 
     } 

     public String getFirstName() { 
      return firstName; 
     } 

     public String getLastName() { 
      return lastName; 
     } 

    } 

} 
+0

Ой, спасибо. Итак, как именно я его инициализирую? Что бы я ему задал? Я действительно не знаю в данный момент ... – Nino

+0

Ну, я бы предположил, что «LinkedList data = new LinkedList ();' будет достаточно. – MadProgrammer

+0

Забудьте об этом, я знаю, что вы имеете в виду, просто немного устал, D Спасибо! Можете ли вы рассказать мне что-нибудь по другим вопросам? – Nino