Java 将对象列表连接到JTable

Java 将对象列表连接到JTable,java,swing,list,Java,Swing,List,我有一个Java中SI(SingleInstruction)类型的对象列表。 下面是SI类及其构造函数 public class SI { private String recipe; private Integer makingOrder; private String instruction; private double estimatedTimeInMinutesSeconds; private Do

我有一个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<SI> 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....
现在,当我按下按钮时,需要更新表格并显示数据。 我已经试了很多,想知道怎么做,但是太难了。我不确定是应该扩展AbstractTableModel还是只使用defaultTableModel

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


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

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

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


如果您选择AbstractTableModel路线,您将使用您自己的数据结构作为模型的核心,因此在这里,您的ArrayList可以正常工作,但您将负责更多更重的工作。这不是不可能做到的,但需要做更多的工作。您可能希望浏览Rob Camick的webtip博客,因为它有一些不错的模型示例。你可以在这里找到它:。特别是,请查看它的条目。

在模型-视图-控制器体系结构中,模型始终负责提供数据。如果您为JTable使用模型,则该模型将提供数据

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

 public class FinalTableModel extends AbstractTableModel {

    private List<SI> li = new ArrayList();
    private String[] columnNames = { "Recipe", "Order", "Instruction",
                "Est.time", "Timer", "Timer Label", "Has Subinstructions"};

    public FinalTableModel(List<SI> 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;
      }
 }
其思想是JTable将通过调用getValueAt(row,col)自动从模型请求数据

Netbeans使将模型分配给JTable变得非常容易。该模型是JTable的一个属性。单击“…”按钮并选择“自定义代码”。下面创建一个模型实例


1)2)你的问题是什么?实际上我一直在想怎么做。。。我检查了很多论坛,这可能是最接近的,但我不知道如何将其应用到我的对象列表中…如何设置列名称和类型?如何将数据传递到表…@Ioannis,是的,BeanTableModel很复杂,因为它使用反射。但是,您不需要自定义任何代码。一行代码用于创建模型,另一行代码用于将模型添加到表中。您下载了
JButtonTableModel.java
代码了吗?它显示了如何直接使用BeanTableModel,或者显示了如何通过几行代码扩展RowTableModel以使用SI对象。我注意到在下面的注释中,您希望支持上下移动行。RowTableModel中已经支持移动行的功能。如果您觉得BeanTableModel太令人困惑,我建议您将注意力集中在JButtonTableModel示例上。除了扩展到RowTableModel而不是AbstractTableModel之外,这些更改与下面使用的几乎相同,这使您能够使用所有RowTableModel方法,而不是自己实现它们。我没有意识到JbuttonTableModel就是一个例子。。。我终于明白了,你是对的。。。使用beanModel很容易。我现在可能会选择rowmodel**如此简单**
private BeanTableModel model=newbeantablemodel(SI.class)
jtable.setmodel(model)
Iterator iter=finalList.Iterator();而(iter.hasNext()){SI SI=(SI)iter.next();model.addRow(SI);}
我也通过一些修改移动了行。。。我知道我不应该使用DefaultTableModel,因为我想在finalList中动态移动数据。行表模型类似于抽象模型,不同之处在于它提供了更多的方法来处理行,而不太关心列,对吗?如果是这样的话,我更喜欢抽象的说法。但是,我无法找出将列表与表连接的代码。如果使用DefaultTableModel,也可以动态移动数据,因此这不是限制。使用DefaultTableModel的主要限制是您不会直接处理SI对象,而是处理SI对象所持有的数据。至于“计算代码”,这是你必须要做的事情。但是,如果您遇到特定问题,请向我们展示您的尝试,我们可能会帮助您。我已经创建了模型类extends abstractTableModel,我知道我的列名,所以我在私有字符串[]columnNames=。。我得到了最初需要的方法,如getColumnCount()、getRowCount()、getColumnName(int col)、getValueAt,但我不知道如何在“private Object[][]data={}”中传递我的列表。在其他帖子中,手动输入数据‘private Object[][]data={{“hgflig”、“Campione”、“Snowboarding”、新整数(5)、新布尔值(false)}'但我不知道如何在那里传递我的SI列表。有没有关于如何在那里传递对象的建议?+1,'RowTableModel'只是显示对象行的起点。您可能希望使用来实现完整的实现。它还有一个示例,说明如何手动扩展RowTableModel以实现两个必需的m方法。我现在正在检查……我做得很好,我设法使用defaultmodel获取了表上的数据,但我需要一个
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);
}
 public class FinalTableModel extends AbstractTableModel {

    private List<SI> li = new ArrayList();
    private String[] columnNames = { "Recipe", "Order", "Instruction",
                "Est.time", "Timer", "Timer Label", "Has Subinstructions"};

    public FinalTableModel(List<SI> 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;
      }
 }
    jScrollPane1 = new javax.swing.JScrollPane();
    jTable1 = new javax.swing.JTable();

    jTable1.setModel(new FinalTableModel(finalList));
    jScrollPane1.setViewportView(jTable1);