[英]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.像setRectangle
或updateRectangle
这样的名称会更合适。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.