在JPanel上绘制一个已经使用绘制方法的形状

时间:2018-03-14 13:14:09

标签: java graphics jpanel paint ellipse

让我们说我有两个类,第一个扩展JPanel并使用Graphics绘制一个游戏板。第二个创建一个JFrame并将面板添加到它。

您可以想象框架看起来像这样: sample JFrame

我现在想在点击时将椭圆添加到特定的矩形。我知道我会使用二维数组来获得我想要的位置,但我不明白椭圆本身是如何被绘制到现有面板上的,因为我使用了paint(Graphics g)绘制棋盘。

以下是在需要时绘制电路板的代码:

class MyBoard extends JPanel {
    private static int height = 6;
    private static int width = 7;
    private static int squareSize = 100;
    private int board[][] = new int[height][width];

    public void paint(Graphics g) {
        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
                g.drawRect(j * squareSize, i * squareSize, squareSize, squareSize);
            }
        }
    }
}

谢谢!

1 个答案:

答案 0 :(得分:2)

您应该记住的前两件事:永远不要覆盖paintpaintComponent并在其中调用super.paintComponent,以便边框和所有内容按预期工作。关于为什么会这样,请参考这个问题:Difference between paint() and paintcomponent()?

现在回答你的问题。假设你有一个现有的逻辑来确定你想要在哪个方格中绘制椭圆(让我们假设你有两个Integer s elXelY,它们是你方块的列和行)完成绘制电路板后,您可以简单地绘制它。

想象一下这样的示例代码:

@Override
public void paintComponent(Graphics g)
{
    super.paintComponent(g);

    // Draw the board
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            g.drawRect(j * squareSize, i * squareSize, squareSize, squareSize);
        }
    }

    // Draw the ellipse at the correct location using half the size of a normal square.
    g.drawOval(elX * squareSize + squareSize / 4, elY * squareSize + squareSize / 4, squareSize / 2 , squareSize / 2);
}

现在是如何实际确定在哪里绘制椭圆的最后一部分。 一个简单的解决方案是在面板中添加MouseListener。然后在mouseClicked方法中计算实际点击的位置。

看起来像这样:

this.addMouseListener(new MouseListener()
{

    @Override
    public void mouseClicked(MouseEvent e)
    {
        int column = e.getX() / squareSize;
        int row = e.getY() / squareSize;

        board[column][row] = 1;
    }

    [...] // add the other methods to override

}

然后你稍微调整你的paintComponent方法:

for (int column = 0; column < width; ++column)
{
    for (int row = 0; row < height; ++row)
    {
        if (board[column][row] == 1)
        {
            g.drawOval(column * squareSize + squareSize / 4, row * squareSize + squareSize / 4, squareSize / 2, squareSize / 2);
        }
    }
}

现在你在任何地方都会画一个椭圆。您还可以检查点击的方块是否已将1设置为值并将其重置为0以具有一些切换机制或增加它并根据整数值绘制不同的内容...这些都是由你决定:)