autorefreshing jtable提取收集数据

autorefreshing jtable提取收集数据

问题描述:

我是一个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

在你打电话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

发现还有什么是错的

private static TableModel model;

后来我做了

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

本来应该 private static DefaultTableModel model;