如何在Java应用程序中向上绘制一个矩形?

6

我该如何在Java应用程序中向上绘制一个矩形?通常,drawRect方法是向下绘制的。我尝试使用负数,但这样做不起作用。

Graphics g = p.getGraphics();
g.fillRect(50, 200,50,100);

展示给我们一个你目前得到的结果和你想要的结果的图片。 - kurtzbot
发布一个小的可运行示例,你可能会得到一个真正有帮助的答案。 - Gene
g.fillRect(0,0,10,10) 将把矩形放在左上角。 - Ray Tayek
3个回答

10
在矩形中,X和Y坐标表示左上角。长度和宽度则从定义点开始绘制。您的示例将一个矩形绘制在50,200处的左上角,宽度为50,高度为100,都朝着正方向从这些点绘制。如果您想要以50,200作为左下角的矩形,只需从该y坐标(200)减去高度,并将其用作起始y坐标即可:
Graphics g = p.getGraphics();
g.fillRect(50, 100, 50, 100);

针对你的示例,尝试使用以下代码(我将仅使用矩形对象而不是实际填充图形):

int baseline = 200;
Rectangle rect1 = new Rectangle(50, baseline - 100, 50, 100);
Rectangle rect2 = new Rectangle(150, baseline - 50, 50, 50);
Rectangle rect3 = new Rectangle(250, baseline - 80, 50, 80);

在图形对象上填充这些尺寸的矩形后,您将获得三个宽度为50的矩形,间距为50,底部都在y = 200直线上。


我应该提到,边缘只能是正数,不能使用负数(正如你所发现的)。在矩形绘制之前,必须执行减法操作。 - Zoe
所以,没有内置的可能性将矩形渲染到顶部而不是底部。因为我假设这样会起作用:g.fillRect(50, 100, 50, -100); - user1035654
这就对了。边长必须是正数。宽度和高度指定线的长度,而不是向量(方向+距离),负线长度并没有实际意义。 - Zoe

2
Java的Graphics类假定原点(0,0)是框架的左上角,也就是说,(1,1)在(0,0)下方和右侧。这与数学相反,在标准笛卡尔平面中,原点是左下角,(1,1)在(0,0)上方和右侧。
此外,Java不允许使用负值作为宽度和高度。这会导致特殊逻辑,通常将矩形与正常的正尺寸矩形区别对待。
要获得所需的结果,首先要反转您在Java的Graphics坐标系统中关于y坐标的思考方式。正y向下,而不是向上(尽管正x仍然向右,像标准笛卡尔图)。
话虽如此,drawRect和fillRect的字段是:
1. 矩形左上角的x坐标 2. 矩形左上角的y坐标 3. 矩形的正宽度 4. 矩形的正高度
Zoe的答案展示了如何获得所需的结果的好例子,我只是想让您更全面地了解“drawRect方法向下绘制”的原因。

1

运行它... 在应用程序窗口中向任何方向拖放鼠标...看看发生了什么... 希望你能从中得到一些想法...

//Simulation of the desktop screen

package raj_java;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class DesktopDemo extends Applet implements MouseListener, MouseMotionListener {

    int x1, y1, x2, y2;
    Image img;

    public void init() {
        setSize(1200, 700);
        setVisible(true);
        img = getImage(getCodeBase(), "Nature.jpg");
        addMouseListener(this);
        addMouseMotionListener(this);
    }

    public void mouseEntered(MouseEvent me) {
        //blank
    }

    public void mouseExited(MouseEvent me) {
        //blank
    }

    public void mouseClicked(MouseEvent me) {
        //blank
    }

    public void mouseReleased(MouseEvent me) {
        Graphics g = getGraphics();
        g.drawImage(img, 0, 0, 1200, 700, this);
    }

    public void mouseMoved(MouseEvent me) {
        //blank
    }

    public void mousePressed(MouseEvent me) {
        x1 = me.getX();
        y1 = me.getY();
    }

    public void mouseDragged(MouseEvent me) {
        x2 = me.getX();
        y2 = me.getY();
        repaint();
    }

    public void paint(Graphics g) {
        g.drawImage(img, 0, 0, 1200, 700, this);
        g.setColor(new Color(10, 99, 126));
        g.drawLine(x1, y1, x2, y1);
        g.drawLine(x2, y1, x2, y2);
        g.drawLine(x2, y2, x1, y2);
        g.drawLine(x1, y2, x1, y1);
        g.setColor(new Color(193, 214, 220, 70));
        int width = Math.abs(x2 - x1);
        int height = Math.abs(y2 - y1);
        if(x2 < x1) {
            g.fillRect(x2, y1, width, height);
        }else if(y2 < y1) {
            g.fillRect(x1, y2, width, height);
        }else {
            g.fillRect(x1, y1, width, height);
        }
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接