在 JPanel 中绘制一个矩形,捕捉到最近的 x 像素

Drawing a rectangle in a JPanel, snapped to the nearest x pixels

我有一个 Swing UI,用户应该能够在 JPanel 中(在某些背景图像上)单击并拖动它来定义给定区域。问题是屏幕上矩形的坐标和表示需要捕捉到它们所绘制区域的外部 4 个像素。背景图像将被放大,这样就无法在这些点之间设置边界,我希望 UI 反映这一点。

举个例子,如果我要单击并绘制一个从 (103, 105) 到 (203,205) 的矩形,该矩形看起来应该覆盖从 (100,104) 到 (204,208) 的区域 - 即最小的可能的矩形,所有角的坐标都应为 4 像素的倍数,并且实际点击的区域被完全覆盖。

我该怎么做?

好吧,我假设你有两个 Point 对象(开始,结束),所以你可以创建一个小方法来调整值。

这是一个简单的入门示例:

import java.awt.*;
public class Main
{
    public static void main(String[] args) throws Exception
    {
        Point start = new Point(103, 105);
        Point end = new Point(203, 205);

        adjust(start, 4, true);
        adjust(end, 4, false);

        System.out.println(start);
        System.out.println(end);
    }

    public static void adjust(Point p, int snap, boolean snapLower)
    {
        int modX = p.x % snap;
        p.x = snapLower ? p.x - modX : p.x + snap - modX;

        int modY = p.y % snap;
        p.y = snapLower ? p.y - modY : p.y + snap - modY;
    }
}