简体   繁体   English

在 Java 中绘制一个矩形

[英]Drawing a rectangle in Java

The following is my attempt to draw a black rectangle in Java, and it seems like there is some issues with the way I call以下是我尝试用 Java 绘制一个黑色矩形,我调用的方式似乎存在一些问题

canvas.drawRectangle(startX, startY, endX, endY);

Here is my entire code.这是我的全部代码。 I am very new to Java and am desperate for help.我是 Java 的新手,非常需要帮助。 Thank you guys so much in advance.非常感谢你们。

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;

/*** I DON'T RECOMMEND TO CHANGE THE BELOW CODE (EVEN THOUGH YOU CAN) ***/
public class Main {
    public static void main(String[] args) {
        showWindow();
    }

    // DON'T CHANGE THE METHOD SIGNATURE OF showWindow()
    public static MainWindow showWindow() {
        return new MainWindow();
    }
}
/*** I DON'T RECOMMEND TO CHANGE THE ABOVE CODE (EVEN THOUGH YOU CAN) ***/

class MainWindow extends JFrame {
    public MainWindow() {
        super("Paint Tool");
        setContentPane(createContentPane());
        setSize(600, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    private JPanel createContentPane() {
        CanvasPanel canvas = new CanvasPanel();
        canvas.addMouseListener(new MouseAdapter() {

            int startX;
            int startY;


            @Override
            public void mousePressed(MouseEvent e) {
                /********************************/
                int startX = e.getX();
                int startY = e.getY();

                /********************************/
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                /********************************/
                int endX = e.getX();
                int endY = e.getY();
                canvas.drawRectangle(startX, startY, endX, endY);
                /********************************/
            }
        });

        JPanel contentPane = new JPanel(new BorderLayout());
        contentPane.add(canvas, BorderLayout.CENTER);
        return contentPane;
    }
}

class CanvasPanel extends JPanel {
    private final BufferedImage image;

    public CanvasPanel() {
        setName("canvas");
        image = new BufferedImage(320, 240, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = image.createGraphics();
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, image.getWidth(), image.getHeight());
        g.dispose();
    }


    public void drawRectangle(int startX, int startY, int endX, int endY) {
        /********************************/
        int px = Math.min(startX,endX);
        int py = Math.min(startY,endY);
        int pw = Math.abs(startX-endX);
        int ph = Math.abs(startY-endY);
        /********************************/
        repaint();
    }

    @Override
    public void paint(Graphics g) {
        g.drawImage(image, 0, 0, this);
        g.setColor(Color.BLACK);
    }
}

Try it like this像这样试试

class CanvasPanel extends JComponent {
  private final Rectangle r;

  public CanvasPanel() {
    r = new Rectangle(0,0,-1,-1);
  }


  public void drawRectangle(int startX, int startY, int endX, int endY) {
    int minX = Math.min(startX, endX);
    int minY = Math.min(startY, endY);
    int maxX = Math.max(startX, endX);
    int maxY = Math.max(startY, endY);
    r.setFrame(minX, minY, maxX - minX, maxY - minY);
    repaint();
  }

  protected void paintComponent( Graphics g ) {
    super.paintComponent(g);

    if (r.width > 0 && r.height > 0) {
      Color oldColor = g.getColor(); 

      g.setColor(Color.BLACK);
      g.fillRect(r.x, r.y, r.width, r.height);

      g.setColor(oldColor);
    }
  }
}

When implementing a custom Swing component, overwrite paintComponent instead of paint .实现自定义 Swing 组件时,覆盖paintComponent而不是paint

Moreover, using an image would only be necessary if you need custom double-buffering.此外,只有在需要自定义双缓冲时才需要使用图像。 But that is not necessary for something as simple as drawing a rectangle.但对于像绘制矩形这样简单的事情来说,这不是必需的。

Finally, drawRectangle is actually a bad name, because this method does not draw anything.最后, drawRectangle实际上是个坏名字,因为这个方法不绘制任何东西。 A name like setRectangle or updateRectangle would be more appropriate.setRectangleupdateRectangle这样的名称会更合适。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM