我想在java应用程序中绘制一个矩形。 我用rectangle2d绘制了一个矩形。 我需要矩形来根据鼠标拖动来改变大小。 即拖动鼠标时矩形的大小会有所不同。 我目前只能绘制一种类型的矩形,即当我将鼠标向下拖动到屏幕右侧时。 但我无法绘制其他矩形。例如。 当鼠标被拖动到屏幕的右上方时。 我正在使用一个名为setRect的方法,它采用矩形的左上角x和y坐标。 但是当我向左拖动鼠标时,我的左上角和右上角发生了变化,我的矩形变形了。

我尽力用语言解释这一点。 如果您对此问题有任何疑问,请打开MS绘图应用程序或任何其他绘图应用程序,选择一个矩形并向所有方向移动鼠标,并在向左,向右,向下拖动鼠标时查看矩形的4个不同方向向左和向右。 其中,当左上坐标保持不变时,我只能绘制一个。 是否有任何功能,我可以用来绘制三个矩形方向的其余部分

===============>>#1 票数:5 已采纳

假设您正在使用从mousePressedmouseDragged MouseEvent获得的两组Points ,请注意以下事项。

把它分解成更小的碎片。 用象限来看它(中心的O是从mousePressed收集的初始Point

           Quadrants
+--------------+---------------+
|              |               |
|              |               |
|      I       |       II      |
|              |               |
|              |               |
+--------------O---------------+
|              |               |
|              |               |
|     IV       |      III      |
|              |               |
|              |               |
+--------------+---------------+

拖动鼠标时,从mouseDragged获得的第二个Point将位于象限I,II,III或IV中。

所以我再说一遍......把它分解成更小的碎片。

如果第二个点位于象限I,你将如何绘制矩形?

  • 然后,第2点将成为绘制的起始点。 所以你必须使用切换绘图点

     // original setRect(p1.x, p1.y, p2.x - p1.x, p2.y - p1.y); // change to setRect(p2.x, p2.y, p1.x - p2.x, p1.y - p2.y); 

    您可以使用逻辑来检查所在的象限点,例如

     public boolean isPointTwoInQuadOne(Point p1, Point p2) { return p1.x >= p2.x && p1.y >= p2.y; } 

希望能帮助你,或者至少帮助你从不同的角度看待问题:)


这是一个运行的例子。 我找到了你的象限,你似乎已经知道了象限III,所以我会把它留给你,想象一下II和IV ;-)

在此输入图像描述

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.Rectangle2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class RectangleDrawWithDrag extends JPanel{
    private static final int D_W = 500;
    private static final int D_H = 500;

    private Point p1;
    private Point p2;
    private Rectangle2D rectangle;

    public RectangleDrawWithDrag() {
        addMouseListener(new MouseAdapter(){
            public void mousePressed(MouseEvent e) {
                p1 = e.getPoint();
                rectangle = new Rectangle2D.Double(p1.x, p1.y, p1.x - p1.x, p1.y - p1.y);
            }
        });
        addMouseMotionListener(new MouseMotionAdapter(){
            public void mouseDragged(MouseEvent e) {
                p2 = e.getPoint();
                if (isPointTwoInQuadOne(p1, p2)) {
                    rectangle.setRect(p2.x, p2.y, p1.x - p2.x, p1.y - p2.y);
                } else {
                    rectangle.setRect(p1.x, p1.y, p2.x - p1.x, p2.y - p1.y);
                }

                repaint();
            }
        });
    }

    public boolean isPointTwoInQuadOne(Point p1, Point p2) {
        return p1.x >= p2.x && p1.y >= p2.y;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        if (rectangle != null) {
            g2.fill(rectangle);
        }
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(D_W, D_H);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new RectangleDrawWithDrag());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

===============>>#2 票数:2

查看自定义绘画方法 ,了解两种常见的绘画方法

  1. 来自对象的ArrayList
  2. 在BufferedImage上

该示例显示如何绘制任意大小和不同颜色的多个矩形。

  ask by user3043728 translate from so

未解决问题?本站智能推荐:

1回复

(Java)绘制的矩形不出现

所以我正在做一个学校项目,我想画一个用矩形制成的游戏板,该矩形保存在数组中。 我设法做到了,但是只有最后绘制的矩形停留在面板上。 我真的很绝望,我不知道我的错误在哪里。 栏位是4x5栏位。 保存在图块类中的坐标: 前两个代表左上角 最后两个代表它的右下角 //错误
3回复

在java中的Jframe上绘制简单的矩形

我正在扩展JFrame,如下所示: 但是,屏幕上只绘制了一个正方形,有人知道为什么吗? 我的Square类看起来像这样:
3回复

在主类之外使用Java的2d图形

我有一个名为Survival的类,其中包含main方法,用于初始化程序。 而不是将图形代码放入此类中,我如何将其移到与生存分离的新类中? 这是Survival.java: 这是GraphicsDisplay.java:
3回复

弹跳矩形(图形g)

我正在玩Java中的图形。 目前,我有一个从左到右移动的矩形。 我希望它一旦碰到Canvas的右侧就开始向左移动,当它碰到右侧时就向左移动,我包括了一个游戏循环,因为这最终将成为我的第一个非常基本的游戏。 谢谢。 PS-我遵循了有关该代码不同部分的一些教程,因此为什么它可能有点混乱,
4回复

Java没有显示矩形?

我正在尝试在指定位置显示一个矩形,但它没有显示出来。 背景是品红色但矩形不存在。 另外:除了“颜色之外,如何访问更多颜色。(此处插入极少数选项)”
1回复

如何通过按键绑定使矩形在屏幕上移动?

我要创建的游戏是蛇,到目前为止,我已经弄清楚了如何使用JPanel和鼠标侦听器来paint(Graphics g) ,现在我试图创建一个可以在屏幕上移动的矩形,使用键绑定或键侦听器,但我不知道该如何处理。 到目前为止,这是我的代码,它分为2部分。 第一部分称为snake2因为如果我不知道
4回复

画一条连接两个矩形的线

我在Swing / AWT中创建自己的类图应用程序,但我停止了这个功能: 我想在已经选择的Class矩形和目标Class矩形之间绘制一条线,但是line有一个特征,就是当我移动其中一个矩形时,连接它们的线在移动的矩形之后以直线方式弯曲,我希望下面的图片展示了我想要实现的目标:
1回复

Java Graphics 2D中的背景颜色始终为黑色

*我正在尝试打印某些东西,但背景为粉红色,文本为白色。 但是文本颜色确实会改变,但屏幕始终为黑色。 * 现在主要方法: 结果: 我一直在互联网上搜索,但最终一无所获。 如果任何人都可以解决此问题,请先谢谢。
2回复

Java(Graphics2D):创建的Graphics2D绘制的三角形直到第二次重绘才可见

我有以下最少的代码来绘制带有箭头的线: 它是这样创建的: 线条已正确绘制,但箭头不可见,直到我调用repaint()为止。 问题在于该元素是可拖动元素,因此每次位置更改时,我都必须两次调用repaint()。 这将使代码更加复杂,并且GUI会变得很落后。 为什么不能只将
2回复

使用秋千在画布上绘制椭圆

我是Java新手,使用paintComponent方法绘制椭圆形时遇到问题。 我发现了许多类似的线程,但是所有的灵魂都不起作用。 我的代码: RacerMain.java Dot.java 为什么它不起作用以及如何使此代码起作用?