0

JTableにレシピを表示する必要のある小さなプログラマーに取り組んでいます。 すべてうまくいくようですが、唯一の問題は、データを適切に保持するオブジェクトを初期化できないことです。ここで私に頭痛を与えるクラスです:AbstractTableModelでのオブジェクトの初期化

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にrecipiesを追加しようとすると、私は構文エラーを取得します。デバッグすると、recipeDBnullの値に初期化されていることがわかります。これはどのように可能ですか?

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; 
    } 
} 
+0

こんにちはtrashgod-巨大なありがとう! – ALMA

答えて

1

構文エラーがRecipeTableModelclass body declarationセクションにrecipeDBにインスタンスメソッドを呼び出すようにしようとするから来ている:

はここに私の他のクラスです。

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

instance initializerまたはコンストラクタでは、メソッド呼び出しが有効です。以下の例ではどちらも必須ではありません。 RecipeスタブのインスタンスがaddRecipe()メソッドを使用してループに追加されます。この1に助けるため

image

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); 
     }); 
    } 
} 
関連する問題