0

我正在尝试通过这个站点学习 AJAX。我已经将它归结为“您必须将代码放入 onModuleLoad()”部分(在清单 4 的正上方)。我在我的 Eclipse 项目中发现了两个提到 onModuleLoad() 的区域:slicr.java 和 gwt-user.jar/com.google.gwt.core.client 包中的实际 EntryPoint.class 文件。当我尝试将列表的内容添加到 slicr.java 时,我得到大量无法解析为类型错误,并且我无法向 EntryPoint.class 添加任何内容,因为它似乎已被锁定,无法编辑。我真的很感谢有人可以给我的任何帮助!

这是我添加到 slicr.java 后的代码:

package com.ibm.examples.client;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
 public class Slicr implements EntryPoint {
private DockPanel panel;
private List clearables;

/**
 * This is the entry point method.
 */
public void onModuleLoad() {
    clearables = new ArrayList();
    initDockPanel();
    panel.add(buildActionPanel(), DockPanel.SOUTH);
    panel.add(buildPizzaTypePanel(), DockPanel.WEST);
    panel.add(buildToppingPanel(), DockPanel.EAST);
    RootPanel.get("slicr").add(panel);
}
private void initDockPanel() {
    panel = new DockPanel();
    panel.setBorderWidth(1);
    panel.setSpacing(5);
}
public HorizontalPanel buildActionPanel() {
    HorizontalPanel actions = new HorizontalPanel();
    actions.setSpacing(10);
    Button clear = new Button("Clear");
    clear.addClickListener(new ClearClickListener());
    Button newPizza = new Button("Another Pizza");
    Button submitOrder = new Button("Submit");
    actions.add(clear);
    actions.add(newPizza);
    actions.add(submitOrder);
    return actions;
}
public static final String[] PIZZA_TYPES = new String[] {
    "Thin Crust Medium", "Thin Crust Large", 
    "Thin Crust X-Large", "Thick Crust Medium", 
    "Thick Crust Large"
};

private VerticalPanel buildPizzaTypePanel() {
    VerticalPanel pizzaTypes = new VerticalPanel();
    HTML label = new HTML("<h2>Pizza</h2>");
    pizzaTypes.add(label);
    for (int i = 0; i < PIZZA_TYPES.length; i++) {
        RadioButton radio = new RadioButton("pizzaGroup", 
            PIZZA_TYPES[i]);
        clearables.add(radio);
        pizzaTypes.add(radio);
    }
    return pizzaTypes;
}
public static final String[] TOPPINGS = new String[] {
    "Anchovy", "Gardineria", "Garlic", 
    "Green Pepper", "Mushrooms", "Olives", 
    "Onions", "Pepperoni", "Pineapple", 
    "Sausage", "Spinach"
};

private VerticalPanel buildToppingPanel() {
    VerticalPanel toppings = new VerticalPanel();
    toppings.add(new HTML("<h2>Toppings</h2>"));
    Grid topGrid = new Grid(TOPPINGS.length + 1, 3);
    topGrid.setText(0, 0, "Topping");
    topGrid.setText(0, 1, "Left");
    topGrid.setText(0, 2, "Right");
    for (int i = 0; i < TOPPINGS.length; i++) {
        Button button = new Button(TOPPINGS[i]);
        CheckBox leftCheckBox = new CheckBox();
        CheckBox rightCheckBox = new CheckBox();
        clearables.add(leftCheckBox);
        clearables.add(rightCheckBox);
        button.addClickListener(new ToppingButtonListener(
                leftCheckBox, rightCheckBox));
        topGrid.setWidget(i + 1, 0, button);    
        topGrid.setWidget(i + 1, 1, leftCheckBox);
        topGrid.setWidget(i + 1, 2, rightCheckBox);
    }
    toppings.add(topGrid);
    return toppings;
}
private class ClearClickListener implements ClickListener {
    public void onClick(Widget sender) {
    for (Iterator iter = clearables.iterator(); iter.hasNext();) {
            CheckBox cb = (CheckBox) iter.next();
            cb.setChecked(false);
        }
    }
}
private class ToppingButtonListener implements ClickListener {

    private CheckBox cb1;
    private CheckBox cb2;

    public ToppingButtonListener(CheckBox cb1, CheckBox cb2) {
        this.cb1 = cb1;
        this.cb2 = cb2;
    }

    public void onClick(Widget sender) {
        boolean unchecked = !cb1.isChecked() && !cb2.isChecked();
        cb1.setChecked(unchecked);
        cb2.setChecked(unchecked);
    }
}

这是EntryPoint.class:

/*
 * Copyright 2006 Google Inc.
 */

package com.google.gwt.core.client;

/**
 * Implement this interface to allow a class to act as a module entry point.
 * Please see the developer guide for more information on modules.
 */
public interface EntryPoint {

/**
 * The entry point method, called automatically by loading a module that
 * declares an implementing class as an entry-point.
 */
void onModuleLoad();
}
4

2 回答 2

1

好的,这是工作代码(至少它的语法是正确的,我没有费心运行它:))。也许它会帮助您了解代码中缺少的内容。

package com.ibm.examples.client;

import java.util.ArrayList;
import java.util.Iterator;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
public class Slicr implements EntryPoint {
    private DockPanel panel;
    private ArrayList<CheckBox> clearables;

    /**
     * This is the entry point method.
     */
    public void onModuleLoad() {
        clearables = new ArrayList<CheckBox>();
        initDockPanel();
        panel.add(buildActionPanel(), DockPanel.SOUTH);
        panel.add(buildPizzaTypePanel(), DockPanel.WEST);
        panel.add(buildToppingPanel(), DockPanel.EAST);
        RootPanel.get("slicr").add(panel);
    }

    private void initDockPanel() {
        panel = new DockPanel();
        panel.setBorderWidth(1);
        panel.setSpacing(5);
    }

    public HorizontalPanel buildActionPanel() {
        HorizontalPanel actions = new HorizontalPanel();
        actions.setSpacing(10);
        Button clear = new Button("Clear");
        clear.addClickListener(new ClearClickListener());
        Button newPizza = new Button("Another Pizza");
        Button submitOrder = new Button("Submit");
        actions.add(clear);
        actions.add(newPizza);
        actions.add(submitOrder);
        return actions;
    }

    public static final String[] PIZZA_TYPES = new String[] {
            "Thin Crust Medium", "Thin Crust Large", "Thin Crust X-Large",
            "Thick Crust Medium", "Thick Crust Large" };

    private VerticalPanel buildPizzaTypePanel() {
        VerticalPanel pizzaTypes = new VerticalPanel();
        HTML label = new HTML("<h2>Pizza</h2>");
        pizzaTypes.add(label);
        for (int i = 0; i < PIZZA_TYPES.length; i++) {
            RadioButton radio = new RadioButton("pizzaGroup", PIZZA_TYPES[i]);
            clearables.add(radio);
            pizzaTypes.add(radio);
        }
        return pizzaTypes;
    }

    public static final String[] TOPPINGS = new String[] { "Anchovy",
            "Gardineria", "Garlic", "Green Pepper", "Mushrooms", "Olives",
            "Onions", "Pepperoni", "Pineapple", "Sausage", "Spinach" };

    private VerticalPanel buildToppingPanel() {
        VerticalPanel toppings = new VerticalPanel();
        toppings.add(new HTML("<h2>Toppings</h2>"));
        Grid topGrid = new Grid(TOPPINGS.length + 1, 3);
        topGrid.setText(0, 0, "Topping");
        topGrid.setText(0, 1, "Left");
        topGrid.setText(0, 2, "Right");
        for (int i = 0; i < TOPPINGS.length; i++) {
            Button button = new Button(TOPPINGS[i]);
            CheckBox leftCheckBox = new CheckBox();
            CheckBox rightCheckBox = new CheckBox();
            clearables.add(leftCheckBox);
            clearables.add(rightCheckBox);
            button.addClickListener(new ToppingButtonListener(leftCheckBox,
                    rightCheckBox));
            topGrid.setWidget(i + 1, 0, button);
            topGrid.setWidget(i + 1, 1, leftCheckBox);
            topGrid.setWidget(i + 1, 2, rightCheckBox);
        }
        toppings.add(topGrid);
        return toppings;
    }

    private class ClearClickListener implements ClickListener {
        public void onClick(Widget sender) {
            for (Iterator iter = clearables.iterator(); iter.hasNext();) {
                CheckBox cb = (CheckBox) iter.next();
                cb.setChecked(false);
            }
        }
    }

    private class ToppingButtonListener implements ClickListener {

        private CheckBox cb1;
        private CheckBox cb2;

        public ToppingButtonListener(CheckBox cb1, CheckBox cb2) {
            this.cb1 = cb1;
            this.cb2 = cb2;
        }

        public void onClick(Widget sender) {
            boolean unchecked = !cb1.isChecked() && !cb2.isChecked();
            cb1.setChecked(unchecked);
            cb2.setChecked(unchecked);
        }
    }
}

请注意一开始的所有导入 - 这些主要是造成您遇到的错误的原因。除此之外,该clearables变量有点问题,我将其更改为泛型ArrayList<CheckBox>以保证类型安全。您还没有编写您使用的 GWT 版本,但是在 2.0 上,上面的某些代码已被弃用(如ClickListener) - 值得研究。如果您刚开始使用 GWT,最好使用当前/推荐的方法,对吗?

PS:您不必发布EntryPoint接口的代码 - 它是 GWT 的一部分,每个人都有它;)
PPS:您使用的那个教程似乎已经过时了 - 您可能需要考虑切换到官方文档

于 2010-03-20T21:31:27.597 回答
0

好的,开始的一般性评论:当您编写 Java 代码时,您编辑 .java 文件。这些 .java 文件包含您的 Java 类。编译一个 .java 文件后,它变成一个 .class 文件。类文件可以由 JVM 运行。

因此,您需要将代码添加到 slicr.java 中的 onModuleLoad(),因为那是您的应用程序的入口点类。

如果您想修复 Eclipse 中缺少的导入,请尝试按 Ctrl-Shift-O。

于 2010-03-20T13:23:11.297 回答