【问题标题】:How can I draw a rectangle towards the top of the application in java如何在java中向应用程序顶部绘制一个矩形
【发布时间】:2012-09-12 07:18:03
【问题描述】:

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

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

【问题讨论】:

  • 向我们展示您正在得到什么以及您想要什么。
  • 发布一个可运行的小例子,你可能会得到一个对你有帮助的答案。
  • g.fillRect(0,0,10,10) 会将矩形放在左上角。

标签: java swing awt graphics2d


【解决方案1】:

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

【讨论】:

  • 我应该提一下,边缘只能是正数,不能使用负数(如您所见)。您必须在绘制矩形之前执行减法。
  • 所以你不可能将矩形渲染到顶部而不是底部。因为我认为这会起作用:g.fillRect(50, 100, 50, -100);
  • 说的差不多。双方必须是积极的。 width和Height指定了线的长度,而不是向量(方向+距离),负线长没有意义。
【解决方案2】:

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

此外,Java 不允许您对宽度和高度使用负值。这导致了特殊的逻辑,通常将矩形与正常的正维度矩形区别对待。

要得到你想要的,首先要把你对JavaGraphics坐标系中y坐标的想法倒过来。正 y 是向下而不是向上(尽管正 x 仍然是正确的,就像标准笛卡尔图一样)。

话虽如此,drawRectfillRect 的字段是:

  1. 矩形左上角的 x 坐标
  2. 矩形左上角的 y 坐标
  3. 矩形的正宽度
  4. 矩形的正高度

Zoe 的回答展示了如何获得您想要的东西的一个很好的例子,我只是想您可能想要更彻底地解释为什么“drawRect 方法会向底部靠拢。”

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-02-23
      • 2011-08-25
      • 1970-01-01
      • 2023-03-05
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      相关资源
      最近更新 更多