在Java的Tic-Tac-Toe中使用画布

在Java的Tic-Tac-Toe中使用画布,java,canvas,awt,Java,Canvas,Awt,我正试图用Java中的awt制作一个井字游戏,但我遇到了一些问题。事实上,这是一项正在进行的工作,它的一些部分还没有完成 代码如下: import java.awt.*; import java.awt.event.*; class tictactoe extends Frame implements ActionListener { public Canvas c1,c2,c3,c4,c5,c6,c7,c8,c9; Panel p; Button b; tict

我正试图用Java中的
awt
制作一个井字游戏,但我遇到了一些问题。事实上,这是一项正在进行的工作,它的一些部分还没有完成

代码如下:

import java.awt.*;
import java.awt.event.*;
class tictactoe extends Frame implements ActionListener
{
    public Canvas c1,c2,c3,c4,c5,c6,c7,c8,c9;
    Panel p;
    Button b;
    tictactoe()
    {
        setLayout(new BorderLayout());
        b=new Button("New Game");
        add(b,BorderLayout.SOUTH); // Button to reset the game
        p=new Panel(new GridLayout(3,3,5,5)); // Canvas objects in GridLayout
        c1=new MyCanvas();
        c2=new MyCanvas();
        c3=new MyCanvas();
        c4=new MyCanvas();
        c5=new MyCanvas();
        c6=new MyCanvas();
        c7=new MyCanvas();
        c8=new MyCanvas();
        c9=new MyCanvas();
        p.add(c1);p.add(c2);p.add(c3);
        p.add(c4);p.add(c5);p.add(c6);
        p.add(c7);p.add(c8);p.add(c9);
        add(p);
        setBounds(400,100,310,310);
        setResizable(false);
        setVisible(true);
    }
    public static void main(String [] args)
    {
        new tictactoe();
    }
    public void actionPerformed(ActionEvent ae)
    {
          // Work in progress
    }
}
class MyCanvas extends Canvas
{
    public void paint(Graphics g)
    {
        setBackground(Color.GREEN);
        g.drawLine(0,0,120,100); // This is the part where I am facing the problem
    }
}

问题是我想在一个
Canvas
元素中调用
drawline()
,但是
drawline()
方法在所有九个Canvas元素中都画了一条线。

假设其他所有元素都正常工作(即使为每个正方形创建单独的画布不是我的方法),您应该能够做到这一点:

Graphics g = c1.getGraphics();
g.drawLine(20, 100, 120, 100);
在这里,您可以单独获取画布的图形对象,然后
draw()
。上面的代码在主类中


为所有画布绘制线条的原因是此方法位于
MyCanvas()的默认绘制方法中
并因此在创建每个
Canvas
对象时执行。

每个Canvas实例的类型都是
MyCanvas
,它的绘制方法绘制了您描述的线条。您好,谢谢您的回复,但我没有明白您所说的…我的意思是我使用的是drawLine()方法,但它在绘制()方法中,不在MyCanvas类的构造函数中,所以它如何影响所有这些类?抱歉,我误读了代码。您基本上覆盖了默认的
paint()
方法,因此当画布自身绘制时,它将始终绘制线条。我建议的方法通过将draw调用移到类之外来缓解这种情况。你的意思是说我应该在main方法中调用drawLine()方法,而被重写的paint()方法将没有任何代码?是的,我会这样做。在类本身中指定绘制对象调用的唯一时间是,如果每个画布都有通用于所有画布的对象,那么画布对象如何调用drawLine()方法呢。??