用Java(JFrame)重新缩放图形

用Java(JFrame)重新缩放图形,java,jframe,Java,Jframe,我需要用java重新缩放图形的最简单方法(例如矩形…)。我找到了“拉伸”它们的方法: 如你所见,公式如下: g.drawRect(100, 100, rectWidth + size.width - originalWidth, rectHeight + size.height - originalHeight); 现在我如何重新缩放图形?宽度和高度必须保持相同的比例。 谢谢。把宽度和高度乘以你想要的比例怎么样? 因此,如果要将其缩放2: g.drawRect(100, 100, 2 * (r

我需要用java重新缩放图形的最简单方法(例如矩形…)。我找到了“拉伸”它们的方法:

如你所见,公式如下:

g.drawRect(100, 100, rectWidth + size.width - originalWidth, rectHeight + size.height - originalHeight);
现在我如何重新缩放图形?宽度和高度必须保持相同的比例。
谢谢。

把宽度和高度乘以你想要的比例怎么样?

因此,如果要将其缩放2:

g.drawRect(100, 100, 2 * (rectWidth + size.width - originalWidth), 2 * (rectHeight + size.height - originalHeight));

基本上有两种不同的方法:

  • 您可以“缩放整个
    图形
  • 可以缩放实际形状
在某些情况下,差异可能很小,但可能很重要:当您缩放整个
图形时,所有的都将被缩放。特别是,当您将其缩放约为
2.0
,然后绘制一条宽度为
1.0
的线时,该线将绘制为2像素宽。这是否需要取决于应用情况

为了缩放实际形状,不能使用
drawRect
方法。相反,您必须创建表示几何形状的
Shape
实例。然后,您可以使用
仿射变换#createTransformedShape
创建这些形状的缩放版本

下面是一个比较这两种方法的示例(并更正了代码中的一些其他问题)。在这两种情况下,绘制原始尺寸为(10,13)的同一矩形,比例为5.0

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ScalingDrawnObjects
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

    private static void createAndShowGUI()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ScalingDrawnObjectsPanel p = new ScalingDrawnObjectsPanel();
        f.getContentPane().add(p);
        f.setSize(600,400);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}

class ScalingDrawnObjectsPanel extends JPanel
{
    @Override
    protected void paintComponent(Graphics gr)
    {
        super.paintComponent(gr);
        Graphics2D g = (Graphics2D)gr;

        Shape rectangle = new Rectangle2D.Double(2, 2, 10, 13);

        g.setColor(Color.RED);
        drawWithScaledGraphics(g, rectangle);

        g.translate(100, 0);

        drawScaledObject(g, rectangle);
    }

    private static void drawWithScaledGraphics(Graphics2D g, Shape shape)
    {
        AffineTransform oldAt = g.getTransform();
        g.scale(5.0, 5.0);
        g.draw(shape);
        g.setTransform(oldAt);
    }

    private static void drawScaledObject(Graphics2D g, Shape shape)
    {
        AffineTransform at = AffineTransform.getScaleInstance(5.0, 5.0);
        g.draw(at.createTransformedShape(shape));
    }

}

根据评论进行编辑

我发布的代码并不“复杂”。它已经编译好了,但不能再编译了。您不应该扩展
JFrame
,也不应该覆盖
paint
。您应该在EDT上创建GUI。你应该

但是,您不应该使用下面这样的代码,但这可能就是您要寻找的

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import java.awt.Dimension;

public class Stretch extends JFrame {
    int originalHeight = 600;
    int originalWidth = 600;
    public Stretch() {
        super("Stretch");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(originalWidth, originalHeight);
    }
    public static void main(String[] args) {
        Stretch s = new Stretch();
        s.setVisible(true);
    }
    public void paint(Graphics g) {
        Dimension size = this.getBounds().getSize();
        int rectWidth = 100;
        int rectHeight = 130;

        g.setColor(Color.white);
        g.fillRect(0, 0, size.width, size.height);

        g.setColor(Color.black);

        int w = rectWidth + size.width - originalWidth;
        int h = rectHeight + size.height - originalHeight;
        double sx = (double)w / rectWidth;
        double sy = (double)h / rectHeight;
        double s = Math.min(sx, sy);
        int fw = (int)(s * rectWidth);
        int fh = (int)(s * rectHeight);
        g.drawRect(100, 100, fw, fh);

    }
}

我不确定这幅画是什么。是长方形的吗?或者矩形只是更复杂图形的占位符?无论如何,如果要缩放向量图形(如所讨论的矩形),并且要保持比率,只需通过保持比率重新计算目标大小:首先计算比率,然后选择宽度(或高度)并乘(或除)即可它通过比率得到另一个维度。最简单的方法是使用
矩形
矩形2D
并简单地对其应用缩放的
仿射变换。否则,您可以缩放属性或
图形
contextFor,或者如果您真的是冒险者,请给出我的答案的注释,问题显然不是重新缩放图形,而是计算一些值,使其看起来像您想要的。更清楚一点。如果你调整窗口大小,绘图应该相应地重新缩放谢谢,但这对我来说太复杂了,解决方案只是一个公式,我想我很抱歉,你能解释一下为什么我不能覆盖画图并扩展JFrame吗?谢谢你最后的代码,完美。。
JFrame
是一个复杂的顶级组件,它的
paint
方法进行了大量的内部管理(当您调整框架大小时,您可能会看到图形闪烁。这是因为您已覆盖了
paint
,并且它无法再正常工作)。如果你只想画一些东西,你应该使用“最简单的组件”,这将是一个
JPanel
,你可以覆盖
paintComponent
——如第一段代码所示。
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import java.awt.Dimension;

public class Stretch extends JFrame {
    int originalHeight = 600;
    int originalWidth = 600;
    public Stretch() {
        super("Stretch");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(originalWidth, originalHeight);
    }
    public static void main(String[] args) {
        Stretch s = new Stretch();
        s.setVisible(true);
    }
    public void paint(Graphics g) {
        Dimension size = this.getBounds().getSize();
        int rectWidth = 100;
        int rectHeight = 130;

        g.setColor(Color.white);
        g.fillRect(0, 0, size.width, size.height);

        g.setColor(Color.black);

        int w = rectWidth + size.width - originalWidth;
        int h = rectHeight + size.height - originalHeight;
        double sx = (double)w / rectWidth;
        double sy = (double)h / rectHeight;
        double s = Math.min(sx, sy);
        int fw = (int)(s * rectWidth);
        int fh = (int)(s * rectHeight);
        g.drawRect(100, 100, fw, fh);

    }
}