2011-05-20 16 views
-2

我是一個java程序員。autorefreshing jtable提取收集數據

我想讓一個讀取集合集合hashSet的JTable,並刷新每一次集合更改,也想每隔3秒重新刷新JPanel表中將在哪裏(這在原始程序中工作)重新刷新autorefresh。 也類班席改變布爾花費時間,我想改變它的JTable中的扭動Mats.name的顏色取決於Mats.take集合中的值,這是自動刷新的原因。

這是一個示例表,其每次添加新行時從scrach重新映射表中拋出java.lang.NullPointerException。 我簡直不明白爲什麼? THX的幫助提前

public class Table extends JFrame { 
    private static JTable table; 
    private static JButton addbuttin; 
    private static TableModel model; 
    private static Set<Mats> set = null; 

    public static String colorString(String str, Mats a) { 
     if (a.getTake().equals(new Boolean(true))) { 
      return "<html><body><font color=red>" + str 
        + "</font></body></html>"; 
     } else { 
      return "<html><body><font color=blue>" + str 
        + "</font></body></html>"; 
     } 
    } 

    public static void main(String[] argv) { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     addbuttin = new JButton("Dodaj"); 
     Mats a = new Mats(10, 10, 5, "WOOD", true); 
     Mats b = new Mats(10, 12, 5, "WOOD", false); 

     set = new HashSet<Mats>(); 
     set.add(a); 
     set.add(b); 

     addbuttin.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       Mats c = new Mats(10, 12, 6, "WOOD", true); 
       set.add(c); 
      } 
     }); 

     JPanel p = new JPanel(); 

     model = new DefaultTableModel() { 
      public boolean isCellEditable(int rowIndex, int vColIndex) { 
       return false; 
      } 
     }; 
/**here is java.lang.NullPointerException*/ 
     table.getModel().addTableModelListener(new TableModelListener() { 

      @Override 
      public void tableChanged(TableModelEvent e) { 
       if (e.equals(TableModelEvent.INSERT)) { 
        model = new DefaultTableModel(); 
        addColumns(); 
        adddata(set); 
       } 

      } 
     }); 
     addColumns(); 
     adddata(set); 
     table = new JTable(model); 

     JScrollPane scrollPane = new JScrollPane(table, 
       JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, 
       JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 

     p.add(scrollPane, BorderLayout.CENTER); 
     p.add(addbuttin, BorderLayout.EAST); 
     p.setSize(500, 400); 

     frame.add(p); 
     frame.setSize(600, 600); 
     frame.setVisible(true); 

    } 

    private static void addColumns() { 
     ((DefaultTableModel) model).addColumn("NAME"); 
    } 

    private static void adddata(Set<Mats> set) { 
     for (Iterator iterator = set.iterator(); iterator.hasNext();) { 
      Mats mats = (Mats) iterator.next(); 

      String n = colorString(mats.getName(), mats); 
      ((DefaultTableModel) model).insertRow(model.getRowCount(), new Object[] { n }); 
     } 
    } 

} 

這是類地墊簡化

public class Mats implements Comparable<Mats> { 


    private String name; 
    private Boolean take; 

    /** 
    * 
    */ 
    public Mats() { 
    } 

    /** 
    * 
    * @param name 
    * @param uzet 
    */ 
    public Mats(String name, boolean take) { 

     this.name = name.toUpperCase(); 
     this.take = take; 
     taken(); 
    } 

    /** 
    * 
    * @param Material 
    */ 
    public Mats(Mats Material) { 
       this.name = Material.getName().toUpperCase(); 
     this.take = Material.getTake(); 
     Material.taken(); 
    } 

     /** 
    * @return the name 
    */ 
    public String getName() { 
     return name; 
    } 

    /** 
    * @param name 
    *   the name to set 
    */ 
    public void setName(String name) { 
     this.name = name.toUpperCase(); 
    } 

    /** 
    * @param take 
    *   the take to set 
    */ 
    public void setTake(Boolean take) { 
     this.take = take; 
    } 

    /** 
    * @return the take 
    */ 
    public Boolean getTake() { 
     return take; 
    } 



    /** 
    * 
    * @return 
    */ 
    @Override 
    public String toString() { 
     return "Material: ".toUpperCase() + getName() + "\n"; 
    } 

    /** 
    * 
    * @param obj 
    * @return 
    */ 
    @Override 
    public boolean equals(Object obj) { 
     Mats a = (Mats) obj; 
     if (obj == null) { 
      return false; 
     } 
     if (a.getName() == this.getName()) { 
      return true; 
     } 
     return false; 
    } 

    /** 
    * 
    * @return 
    */ 
    @Override 
    public int hashCode() { 
     int hash = 3; 
     hash = 83 * hash + this.getX(); 
     hash = 83 * hash + this.getY(); 
     hash = 83 * hash 
       + (this.getName() != null ? this.getName().hashCode() : 0); 
     return hash; 
    } 

    /** 
    * 
    */ 
    public void taken() { 
     MatRespawn s = new MatRespawn(1000, take); 
     s.start(); 
    } 

    @Override 
    public int compareTo(Mats o) { 
     Integer a = this.getName(); 
     if (a.compareTo(o.getName()) != 0) 
      return a.compareTo(o.getName()); 
     return 0; 
    } 
} 

類MatRespawn從而改變Mats.take

public class MatRespawn extends Thread { 
    private int time; 
    private Boolean taken; 

    public MatRespawn(int time, Boolean take) { 
     this.time = time; 
     this.taken = take; 
    } 

    public int getTime() { 
     return time; 
    } 

    public void setTime(int time) { 
     this.time = time; 
    } 

    public Boolean getTaken() { 
     return taken; 
    } 

    public void setTaken(Boolean taken) { 
     this.taken = taken; 
    } 

    @Override 
    public void run() { 
     try { 
      while (true) { 
       if (taken.equals(new Boolean(true))) { 
        sleep(time * 10); 
        //JOptionPane.showMessageDialog(null, "dostupnost: " + taken); 
        taken = false; 
       } 

       sleep(time); 
       //JOptionPane.showMessageDialog(null, "dostupnost: " + taken); 
       taken = true; 

      } 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+4

需要在標題中全部大寫?你發佈的所有代碼?由於這些項目,我跳過了這個問題。 – jzd 2011-05-20 14:05:35

+2

擺脫所有的靜態方法。這不是設計你的班級的方式。 – camickr 2011-05-20 14:56:58

+0

我是一個java程序員,所以我不確定問題到底是什麼。 – nkvnkv 2011-05-20 19:08:20

回答

0

在你打電話table.getModel()的時候,你的避風港」 t還叫table = new JTable(model); 這意味着table仍然是null,所以你會得到一個異常。嘗試將構建table的行移到訪問它的行之前。

+0

java.lang.NullPointerException現在已修復。 thx – nkvnkv 2011-05-20 19:07:46

+0

@user好極了!如果有幫助,請隨時將此標記爲正確答案。 – dlev 2011-05-20 19:28:34

+0

發現還有什麼錯誤 – nkvnkv 2011-05-21 15:23:42

0

發現還有什麼是錯的

private static TableModel model;

後來我做了

model = new DefaultTableModel() { 
      public boolean isCellEditable(int rowIndex, int vColIndex) { 
       return false; 
      } 
     }; 

本來應該 private static DefaultTableModel model;