如何在java中向应用程序顶部绘制一个矩形

时间:2012-09-19 22:42:19

标签: java swing awt graphics2d

如何在java中向应用程序顶部绘制一个矩形?通常drawRect方法向底部绘制,我试图使用负数,但这不起作用

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

3 个答案:

答案 0 :(得分:9)

在矩形中,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线上。

答案 1 :(得分:2)

Java的Graphics类假定原点(0, 0)是框架的左上角,即(1, 1)向下和(0, 0)的右侧。这与数学相反,数学中标准笛卡尔平面的原点是左下角,(1, 1)位于(0, 0)的上方和右侧。

此外,Java不允许您对宽度和高度使用负值。这导致特殊逻辑通常以不同于正常的正尺寸矩形来处理矩形。

为了获得你想要的东西,首先要反思你对Java Graphics坐标系中y坐标的看法。正y是向下的,而不是向上的(虽然正x仍然是正确的,就像标准的笛卡尔图一样)。

话虽如此,drawRectfillRect的字段为:

  1. 矩形左上角的x坐标
  2. 矩形左上角的y坐标
  3. 矩形的正宽度
  4. 矩形的正高度
  5. Zoe的答案显示了如何获得所需内容的一个很好的例子,我只是想你可能想要更详尽地解释为什么“drawRect方法会走向最底层。”

答案 2 :(得分:0)

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

//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);
        }
    }

}