views:

34

answers:

2

I'm attempting to learn AJAX via this site. I've made it down to the section where it says "you must put the code in the onModuleLoad()" (right above listing 4). I found two areas in my Eclipse project that mention onModuleLoad(): slicr.java and the actual EntryPoint.class file in the gwt-user.jar/com.google.gwt.core.client package. When I try to add the contents of listing for to slicr.java, I get tons of cannot be resolved to a type errors and I cant add anything to EntryPoint.class as it appears to be locked from editing. I really appreciate any help someone could give me!

Here's the code I have after adding to the 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);
    }
}

And here's 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();
}
A: 

Ok, a general remark to start with: when you're writing Java code, you edit .java files. These .java files contain your Java classes. After compiling a .java file, it becomes a .class file. Class files can be run by the JVM.

So, you need to add your code to onModuleLoad() in slicr.java, since that is the entry point class of your app.

If you want to fix the missing imports in Eclipse, try hitting Ctrl-Shift-O.

Eric Eijkelenboom
PS, if you just want to learn Ajax, then I'm not sure GWT is the best place to start, since it requires learning Java. Try a JavaScript library like Prototype or JQuery instead.
Eric Eijkelenboom
Ricky
Also, I just used the GWT to generate the basic files. I'm working exclusively in Eclipse now.
Ricky
@Ricky: you can edit your question and add the code there. But I'd start by learning Java, since you don't seem to be too familiar with it.
Igor Klimer
Thanks for the advice guys. I'll be the first to admit I'm not the greatest with Java, I'm just trying to get over this stall I've been on.
Ricky
+1  A: 

OK, here's the working code (at least it's syntax is correct, I didn't bother running it :)). Maybe it will help you understand what was missing from your code.

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);
        }
    }
}

Notice all the imports at the beginning - those were mostly responsible for the errors you got. Other than that, the clearables variable was a bit problematic, I changed it to a generic ArrayList<CheckBox> for type-safety goodness. You haven't written which version of GWT you are using, but on 2.0 some of the code above is deprecated (like ClickListener) - something worth investigating. If you are just starting out with GWT, it's best to use the current/recommended methods, right?

PS: you didn't have to post the code for the EntryPoint interface - it's part of the GWT, everyone has it ;)
PPS: that tutorial you are using seems to be outdated - you might want to consider switching to the official docs.

Igor Klimer
Wow, thank you so much for your help. This cleared up so many of the questions I have. I am still getting some compiling errors such as Line 24: The type ArrayList is not generic; it cannot be parameterized with arguments <CheckBox> but as least I can work with that. Thanks again for all your help!
Ricky