0

我正在开发一个小程序,它应该在JTable. 一切似乎都很好,我唯一遇到的问题是我无法初始化应该正确保存数据的对象。这是让我头疼的课程:

class RecipeTableModel extends AbstractTableModel {

    private String[] columnNames = {"Number", "Name", "Difficulty",
        "Preparation", "PreparationTime", "Quantity", "Incredients"};
    Recipe recipe1 = new Recipe("1", "SecretRecipe", "easy", "microwave", "20min", "100gr", "flour");
    Recipe recipe2 = new Recipe("2", "SuperRecipe", "medium", "microwave", "30min", "100gr", "Salt");
    **RecipeDB recipeDB = new RecipeDB();
    recipeDB.addRecipe (Recipe recipe1);**


    @Override
    public int getColumnCount() {
        return 7;
    }

    public int getRowCount() {
        //return recipeDB.getRecipeDBSize();
        return 15;
    }

    @Override
    public Object getValueAt(int row, int col) {

    /*  Recipe recipe = recipeDB.getRecipe(row);
        switch (col){
        case 0:
            return recipe.getNumber();
        case 1:
            return recipe.getName();
        case 2:
            return recipe.getPrep();
        case 3:
            return recipe.getPrepTime();
        case 4:
            return recipe.getDifficulty();
        case 5:
            return recipe.getIngredients(); 
        }
        */
        return null;
    }

    public String getColumnName(int column) {
        return columnNames[column];
    }
}

当我尝试将接收方添加到recipeDB;时出现语法错误 当我调试时,我看到它recipeDB被初始化为一个null值。这怎么可能?

这是我的另一堂课:

import java.util.ArrayList;

public class RecipeDB {

    public ArrayList<Recipe> recipeArraylist;

    public RecipeDB() {
        recipeArraylist = new ArrayList<Recipe>();
    }

    public void addRecipe(Recipe recipe) {
        recipeArraylist.add(recipe);
    }

    public int getRecipeDBSize() {
        return recipeArraylist.size();
    }

    public Recipe getRecipe(int i) {
        return recipeArraylist.get(i);
    }

    public ArrayList getDBArrayList() {
        return recipeArraylist;
    }
}
4

1 回答 1

1

语法错误来自于尝试recipeDB在 的类主体声明部分中调用实例方法RecipeTableModel

RecipeDB recipeDB = new RecipeDB();  // legal declaration and initialization
recipeDB.addRecipe (Recipe recipe1); // illegal method invocation

方法调用在实例初始化器或构造器中是合法的。在下面的示例中,两者都不是必需的;使用该方法将存根的实例Recipe添加到循环中addRecipe()

图片

import java.awt.EventQueue;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

class RecipeTableModel extends AbstractTableModel {

    private final String[] columnNames = {"Number", "Name", "Difficulty",
        "Preparation", "Prep Time", "Quantity", "Ingredients"};
    private final RecipeDB recipeDB = new RecipeDB();

    @Override
    public int getColumnCount() {
        return columnNames.length;
    }

    @Override
    public int getRowCount() {
        return recipeDB.getRecipeDBSize();
    }

    @Override
    public Object getValueAt(int row, int col) {
        return "(" + row + ", " + col + ")";
    }

    @Override
    public String getColumnName(int column) {
        return columnNames[column];
    }

    private static class RecipeDB {

        public ArrayList<Recipe> recipeArraylist = new ArrayList<Recipe>();

        public void addRecipe(Recipe recipe) {
            recipeArraylist.add(recipe);
        }

        public int getRecipeDBSize() {
            return recipeArraylist.size();
        }

        public Recipe getRecipe(int i) {
            return recipeArraylist.get(i);
        }

        public ArrayList getDBArrayList() {
            return recipeArraylist;
        }
    }

    private static class Recipe {}

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            RecipeTableModel model = new RecipeTableModel();
            for (int i = 0; i < 42; i++) {
                model.recipeDB.addRecipe(new Recipe());
            }
            JFrame f = new JFrame("Test");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(new JScrollPane(new JTable(model)));
            f.pack();
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        });
    }
}
于 2016-07-15T00:14:17.023 回答