Codename one error : java.lang.IllegalArgumentException: Component is already contained in Container

Codename one error : java.lang.IllegalArgumentException: Component is already contained in Container

这是我在 运行 项目时遇到的错误:

java.lang.IllegalArgumentException: Component is already contained in Container

这是因为 Buttons 的声明在 createcell 方法之外,但问题是如果我在方法内部声明它们 ActionListener 不起作用

Button eval = new Button("Evaluate");
Button img = new Button("See image");
Object[][] rows = new Object[articles.size()][];
for (int iter = 0;
        iter < rows.length;
        iter++) {
    rows[iter] = new Object[]{
        articles.get(iter).getName(),
        0,
        articles.get(iter).getDescription(),
        articles.get(iter).getLabel(),
        articles.get(iter).getQuantity(),
        articles.get(iter).getRating(), 0
    };
}

TableModel model = new DefaultTableModel(new String[]{"name", "description", "Image", "label", "quantity", "rating", "rate"}, rows);
Table table = new Table(model) {
    @Override
    protected Component createCell(Object value, int row, int column, boolean editable) {

        if (row > -1 && column == 2) {
            return img;
        }
        if (row > -1 && column == 6) {
            return eval;
        }
        eval.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent evt) {
                Dialog.show("thank you for rating our product ", createStarRankSlider(5), new Command("Cancel"));
            }
        });
        value.toString();
        img.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent evt) {
                Dialog.show("HAY LIMAGE", "Insert image here", new Command("Cancel"));
            }
        });
        return super.createCell(value, row, column, editable);
    }
};

add(table);

您正在返回组件的相同实例,而不是创建新实例。您必须始终在此方法中创建一个组件。

例如为 table 的单元格 1,1 调用此方法。 Returns 图片。然后对于 1,2 和 returns img... 因为 img 已经有一个父组件,所以这将失败。