将对象列表连接到JTable

我有一个Java类型的SI(SingleInstruction)对象列表。 这是带有构造函数的SI类。

public class SI { private String recipe; private Integer makingOrder; private String instruction; private double estimatedTimeInMinutesSeconds; private Double timerInMinutesSeconds; private String timerEndingText; private boolean containsOtherInstructions = false; private List embeddedInstructionsList; public SI (String s1, Integer i1, String s2, double d1, Double d2, String s3){ recipe = s1; makingOrder = i1; instruction = s2; estimatedTimeInMinutesSeconds = d1; timerInMinutesSeconds = d2; timerEndingText = s3; } setters and getters methods ommited.... 

我需要在GUI中有一个表格,显示该列表的数据。 当我开始这个程序时,我创建了一个

 public List finalList = new ArrayList(); 

这是空的,所以我需要一个空表来显示。 该表应该有列

(String Recipe,Integer Order,String Instruction,double Est.time,Double Timer,String TimerText,boolean containsOtherInstructions)

之后,finalList填充了数据,我需要在表格中显示这些数据。 为了给你一个例子,我创建了一个创建一些SI的按钮并将它们添加到finalList。

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { SI si1 = new SI("Greek Salad", 1, "cut veggies", 4, null, null); SI si2 = new SI("Greek Salad", 2, "put spices", 1, null, null); SI si3 = new SI("Greek Salad", 3, "feta and finish", 1, null, null); SI si4 = new SI("Break", null, "Your free 10 minutes", 10, null, null); SI si5 = new SI("Meat", 1, "preheat oven", 0.5, 10.0, "oven is ready"); SI si6 = new SI("Meat", 2, "spices on meat", 2, null, null); SI si7 = new SI("Meat", 3, "cook meat", 1, 10.0, "meat is ready"); SI si8 = new SI("Meat", 4, "serve", 1, null, null); SI si9 = new SI("Break", null, "Your free 10 minutes", 10, null, null); SI si10 = new SI("Jelly", 1, "Boil water", 0.5, 4.0, "water is ready"); SI si11 = new SI("Jelly", 2, "add mix and stir", 4, null, null); SI si12 = new SI("Jelly", 3, "share in bowls, wait 3 hours", 2, null, null); finalList.add(si1); finalList.add(si2); finalList.add(si3); finalList.add(si4); finalList.add(si5); finalList.add(si6); finalList.add(si7); finalList.add(si8); finalList.add(si9); finalList.add(si10); finalList.add(si11); finalList.add(si12); } 

现在我需要按下按钮,表格会更新并显示数据。 我已经尝试了很多方法来了解如何做到这一点,但这太难了。 我不确定是否应该扩展AbstractTableModel或只使用defaultTableModel。

为了帮助您提供建议,此表的数据是最终的,用户无法修改任何单元格。 应该允许用户做的是向上或向下移动行以更改finalList中的顺序。

PS:如果您对GUI构建器有任何快速建议,我正在使用netbeans。

在模型 – 视图 – 控制器架构中,模型始终负责提供数据。 如果您为JTable使用模型,则模型会提供数据。

为了创建模型,创建一个扩展AbstractTableModel的单独类,并具有一个构造函数,用于创建所需的所有SI对象并将它们存储到ArrayList中。

  public class FinalTableModel extends AbstractTableModel { private List li = new ArrayList(); private String[] columnNames = { "Recipe", "Order", "Instruction", "Est.time", "Timer", "Timer Label", "Has Subinstructions"}; public FinalTableModel(List list){ this.li = list; } @Override public String getColumnName(int columnIndex){ return columnNames[columnIndex]; } @Override public int getRowCount() { return li.size(); } @Override public int getColumnCount() { return 7; } @Override public Object getValueAt(int rowIndex, int columnIndex) { SI si = list.get(rowIndex); switch (columnIndex) { case 0: return si.getRecipe(); case 1: return si.getMakingOrder(); case 2: return si.getInstruction(); case 3: return si.getEstimatedTimeInMinutesSeconds(); case 4: return si.getTimerInMinutesSeconds(); case 5: return si.getTimerEndingText(); case 6: return si.isContainsOtherInstructions(); } return null; } @Override public Class getColumnClass(int columnIndex){ switch (columnIndex){ case 0: return String.class; case 1: return Integer.class; case 2: return String.class; case 3: return Double.class; case 4: return Double.class; case 5: return String.class; case 6: return Boolean.class; } return null; } } 

然后制作你的JFrame,并像这样创建你的JTable:

  jScrollPane1 = new javax.swing.JScrollPane(); jTable1 = new javax.swing.JTable(); jTable1.setModel(new FinalTableModel(finalList)); jScrollPane1.setViewportView(jTable1); 

我们的想法是JTable将通过调用getValueAt(row,col)自动请求模型中的数据。

Netbeans可以很容易地将模型分配给JTable。 该模型是JTable的属性。 单击“…”按钮,然后选择“自定义代码”。 在下面创建一个模型实例。

在此处输入图像描述

使用DefaultTableModel更容易,但是您需要不使用ArrayList,而是使用DefaultTableModel保存的数据模型,尽管您可以使用ArrayList加载模型。

您可以使用列标题和0行的数组构造DefaultTableModel,然后在for循环中添加行,使用上面的ArrayList创建VectorObject[] ,然后将其输入到模型中它的addRow方法。 请注意,您不能将SI对象添加为行,而是必须从每个SI对象中提取数据并将其放入Object数组或Object Vector中。

如果您改为使用AbstractTableModel路径,那么您将使用自己的数据结构作为模型的核心,所以在这里,您的ArrayList可以正常工作,但是您需要承担更多更重的提升。 这不是不可能的,但需要更多的工作。 您可能希望浏览Rob Camick的webtip博客,因为它有一些不错的模型示例。 你可以在这里找到它: Java Tips Weblog 。 特别是,请查看它的行表模型条目。