在 Java 中绘制矩形

Drawing Rectangle in Java

我正在尝试绘制一个矩形。但我不确定它是如何在某些面板上绘制的。想看一个例子,我如何提供面板和绘制矩形的位置。我有以下模板,我想看看我需要做哪些修改才能使用此 class 在任何面板上绘制矩形。我的意图是使用面板的宽度和高度,并在该位置添加一个矩形。目标是能够在任何地方使用任何 JPanels class。

import java.awt.Color;
import java.awt.Graphics;    
import javax.swing.JPanel;    

public class DrawRectangle{

    private int startX;
    private int startY;
    private int width;
    private int height;
    private Color color;
    private JPanel panel;

    public DrawRectangle(JPanel panel, int startX, int startY, int width, int height, Color color) {
        this.startX = startX;
        this.startY = startY;
        this.width = width;
        this.height = height;
        this.color = color;
            this.panel = panel; 
    }

    public void paint(Graphics g) {
        g.setColor(this.color);
        g.fillRect(this.startX, this.startY, this.width, this.height);
        g.drawRect(this.startX, this.startY, this.width, this.height);
    }
}

您必须通过以下方式修改感兴趣的 JPanel 才能使用该代码:

  • 覆盖其 paintComponent 方法
  • 首先在您的重写中调用 super 的 paintComponent 方法
  • 然后绘制自己的DrawRectangleclass的paint方法
  • 如果您希望能够绘制多个矩形,则给 JPanel 一个 List<DrawRectangle> 并在 paintComponent
  • 内的 for 循环中绘制它们

例如,对于一个矩形:

public class DrawingPanel extends JPanel {
    private DrawRectangle drawRectangle;

    public DrawingPanel(DrawRectangle drawRectangle) {
        this.drawRectangle = drawRectangle;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (drawRectangle != null) {
            drawRectangle.paint(g);
        }
    }
}

对于许多矩形:

public class DrawingManyRectPanel extends JPanel {
    private List<DrawRectangle> drawRectangles;

    public DrawingManyRectPanel(List<DrawRectangle> drawRectangles) {
        this.drawRectangles = drawRectangles;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (drawRectangles != null) {
            for (DrawRectangle rectangle : drawRectangles) {
                rectangle.paint(g);
            }
        }
    }
}

在这些 class 中,构造函数被覆盖以允许通过构造函数调用将矩形注入 class。对于第二个 class,我还要添加一个允许添加更多矩形的方法:

public void addRectangle(DrawRectangle rectangle) {
    drawRectangles.add(rectangle);
    repaint();
}

删除矩形类似


如果您不打算删除矩形或修改已绘制的矩形,另一种方法是在 BufferedImage 中绘制它们,然后在绘图 JPanel 的 paintComponent 方法中绘制该图像。

查看 Graphics2D class 它正是您想要做的,并且比常规 paintComponent 方法更适合绘图。您可以阅读有关如何使用 Graphics2D here 的信息。

首先请注意,如果不像我在 Graphics2D g2 = (Graphics2D) g;.

中那样从 Graphics 对象强制转换它,就不能拥有 Graphics2D 对象

这是一个可以帮助您入门的示例,请记住我使用的是绝对布局,因此没有布局管理器。这是我用来创建二十一点游戏的代码,所以这就是为什么名称不是通用的。

我还添加了平滑,这样使用 Graphics2D 的形状看起来会非常漂亮,而且这些方法可以使屏幕上的形状居中,这可能会很好地与您的 JPanel 配合使用。

请注意我是如何为要绘制的 Graphics2D 对象创建特定方法,然后使用 Graphics class 绘制它们的。这似乎对我来说效果最好,这样我的 paintComponent 就不会到处都是无休止的重复代码。 frame 在我的代码中得到了 JFrame 的宽度和高度我有 JPanel 所以你只需参考 JPanel 就可以了。

class DrawTable extends JPanel
{

    DrawTable()
    {
        super();
        System.out.println("Looks good to me pal!");
    }

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

        //Setup background
        drawRectangle(g, Color.BLACK,
                frame.getWidth() / 2, frame.getHeight() / 2,
                frame.getWidth(), frame.getHeight());

        // Create table at center
        drawRectangle(g, new Color(206, 187, 158),
                frame.getWidth() / 4, frame.getHeight(), //left table leg
                50, 600);
        drawRectangle(g, new Color(206, 187, 158),
                frame.getWidth() / 1.5, frame.getHeight(), //right table leg
                50, 600);
        drawEllipse(g, new Color(153, 154, 104),
                frame.getWidth() / 2, frame.getHeight() / 2, //Draws outer circle
                1200, 400);
        drawEllipse(g, new Color(53, 101, 77),
                frame.getWidth() / 2, frame.getHeight() / 2, //Draws inner circle
                1125, 350);
    }

    private void drawEllipse(Graphics g, Color color, double x, double y, double width, double height) //centers ellipse
    {
        Graphics2D g2 = (Graphics2D) g;
        double centerX = (double) x - width / 2;
        double centerY = (double) y - height / 2;
        Ellipse2D ellipse = new Ellipse2D.Double(centerX, centerY, width, height);
        RenderingHints render = new RenderingHints(
                RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        render.put(
                RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);
        g2.setRenderingHints(render);
        g2.setColor(color);
        g2.fill(ellipse);
        g2.draw(ellipse);
    }

    private void drawRectangle(Graphics g, Color color, double x, double y, double width, double height) //centers rectangle
    {
        Graphics2D g2 = (Graphics2D) g;
        double centerX = (double) x - width / 2;
        double centerY = (double) y - height / 2;
        Rectangle2D rect = new Rectangle2D.Double(centerX, centerY, width, height);
        RenderingHints render = new RenderingHints(
                RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        render.put(
                RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);
        g2.addRenderingHints(render);
        g2.setColor(color);
        g2.fill(rect);
    }
}

如果您需要帮助,请告诉我!