将对象列表连接到JTable

Ioa*_*tos 4 java swing list

我有一个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....
Run Code Online (Sandbox Code Playgroud)

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

public List<SI> finalList = new ArrayList();
Run Code Online (Sandbox Code Playgroud)

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

(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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Cos*_*lis 5

在模型 - 视图 - 控制器架构中,模型始终负责提供数据.如果您为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;
      }
 }
Run Code Online (Sandbox Code Playgroud)

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

    jScrollPane1 = new javax.swing.JScrollPane();
    jTable1 = new javax.swing.JTable();

    jTable1.setModel(new FinalTableModel(finalList));
    jScrollPane1.setViewportView(jTable1);
Run Code Online (Sandbox Code Playgroud)

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

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

在此输入图像描述