【问题标题】:Using canvas in Tic-Tac-Toe in Java在 Java 井字游戏中使用画布
【发布时间】:2015-07-20 10:41:03
【问题描述】:

我正在尝试在 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() 方法在所有九个画布元素中画了一条线。

【问题讨论】:

  • 每个画布实例的类型都是MyCanvas,它的paint方法绘制了您描述的线条。

标签: java canvas awt


【解决方案1】:

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

Graphics g = c1.getGraphics();
g.drawLine(20, 100, 120, 100);

您可以在其中单独获取画布的图形对象,然后将 draw() 获取到它。上面的代码在你的主类里面。

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

【讨论】:

  • 您好,感谢您的回复,但我没有明白您所说的...我的意思是我使用的是 drawLine() 方法,但它在 paint() 方法中,而不是在 MyCanvas 类的构造函数中,所以它怎么可能影响所有这些?
  • 对不起,我看错了代码。你基本上覆盖了默认的paint() 方法,所以当画布自己绘制时,它总是会画线。我建议的方法通过将绘图调用移到类之外来缓解这种情况。
  • 你的意思是说我应该在main方法中调用drawLine()方法,而被覆盖的paint()方法不会有任何代码?
  • 是的,我就是这样做的。您唯一需要在类本身中指定绘制对象的调用是,如果每个画布都具有通用绘制到所有画布的东西。
  • 但是画布对象如何调用 drawLine() 方法??
猜你喜欢
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
相关资源
最近更新 更多