本帖最后由 zheweiyu 于 2013-08-16 16:44:22 编辑

解决方案 »

  1.   

    完整源码import java.awt.*;class ToeDialog extends Dialog{
    static final int BLANK=0;
    static final int XX=1;
    static final int OO=2;
    int turn =XX;
    public ToeDialog(Frame parent,int w,int h){
    super(parent,"The game itself",false);//modal - 指定在显示的时候是否阻止用户将内容输入到其他顶级窗口中。
    //如果该参数为 false,则 dialog 是 MODELESS;如果该参数为 true,则模式类型属性被设置为 DEFAULT_MODALITY_TYPE 
    setLayout(new GridLayout(w,h));
    for(int i=0;i<w*h;i++){
    add(new ToeButton(this));
    }
    resize(w*50,h*50);
    }
    public boolean handleEvent(Event evt){
    if(evt.id==Event.WINDOW_DESTROY){
    dispose();
    }
    else
    return super.handleEvent(evt);
    return true;
    }
    }class ToeButton extends Canvas{
    int state=ToeDialog.BLANK;
    ToeDialog parent;
    ToeButton(ToeDialog parent){
    this.parent=parent;
    }
    public void paint(Graphics g){
    int x1=0;
    int y1=0;
    int x2=size().width-1;
    int y2=size().height-1;
    g.drawRect(x1, y1, x2, y2);
    x1=x2/4;
    y1=y2/4;
    int wide=x2/2;
    int high=y2/2;
    if(state==ToeDialog.XX){                     //画X
    g.drawLine(x1, y1, x1+wide, y1+high);
    g.drawLine(x1, y1+high, x1+wide, y1);
    }
    if(state==ToeDialog.OO){                     //画圆
    g.drawOval(x1,y1,x1+wide/2,y1+high/2);
    }
    }
    public boolean mouseDown(Event evt,int x,int y){
    if(state==ToeDialog.BLANK){
    state=parent.turn;
    parent.turn=(parent.turn==ToeDialog.XX ? ToeDialog.OO:ToeDialog.XX);//设置了一个变量。用于在XX和OO间转化。
    }
    else if(state==ToeDialog.OO||state==ToeDialog.XX){

    }
    repaint();
    return true;
    }
    }public class ToeTest extends Frame{
    TextField rows=new TextField("3");
    TextField cols =new TextField("3");
    public ToeTest(){
    setTitle("Toe Test");
    Panel p=new Panel();
    p.setLayout(new GridLayout(2,2));
    p.add(new Label("Rows",Label.CENTER));
    p.add(rows);
    p.add(new Label("Columns",Label.CENTER));
    p.add(cols);
    add("Center",p);
    add("South",new Button("go"));
    }
    public boolean handleEvent(Event evt) {
    if(evt.id==Event.WINDOW_DESTROY)
    System.exit(0);
    else 
    return super.handleEvent(evt);
    return true;
    }
    public boolean action(Event evt,Object arg){
    if(arg.equals("go")){
    Dialog d=new ToeDialog(
    this,
    Integer.parseInt(rows.getText()),
    Integer.parseInt(cols.getText()));
    d.show();
    }
    else
    return super.action(evt, arg);
    return true;
    }
    public static void main(String[] args) {
    Frame f=new ToeTest();
    f.resize(200,100);
    f.show();
    }
    }
      

  2.   

    这都是些算坐标的事吧,你用debug跟进去看看就懂了
      

  3.   

    你用debug跟进去看看就懂了
    服了
      

  4.   

     g.drawLine() 画线
       drawOval()  画圈
       drawRect()  矩形
     其中包括两个坐标A ,B。
    A,B固定所画图形的位置、。不懂你哪儿不懂。
      

  5.   

         int x1=0;
            int y1=0;
            int x2=size().width-1;
            int y2=size().height-1;
            g.drawRect(x1, y1, x2, y2);
    这里不是只画了一个框么。下面的
     x1=x2/4;
            y1=y2/4;
            int wide=x2/2;
            int high=y2/2;是做什么用的,
      

  6.   

    为了之后画X做准备。谢谢了,我之前我是在纠结那些小格子是怎么画出来的。是我没看仔细,上面还有个public ToeDialog(Frame parent,int w,int h)。现在找到原因了。还是非常感谢你花时间帮我解决问题。