gpt4 book ai didi

java - 在 Java Swing 中旋转 JLabel 和 ImageIcon

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:14:34 25 4
gpt4 key购买 nike

首先,这是我使用swing的第一周,如果我的问题太明显了,请见谅。此外,我需要使用标准 Java 库的解决方案,因为这是作业,我不允许使用奇怪的库。

我使用 JLabel 和 ImageIcon 在 JFrame 上显示图像。现在我想将屏幕上的图像旋转到任意角度。我发现了一些关于 Graphics2D 的信息,但我找不到这样做的方法。

由于我发现的解决方案不起作用或者我不理解它们,所以我对旋转 ImageIcon 或 JLabel 的任何解决方案感兴趣。由于我在 JLabel 上执行 setBounds 定位图像,我认为旋转 JLabel 将是更好的解决方案(这样我就不会被迫保存 ImageIcon 对象)。

感谢您的关注,抱歉我的英语不好。

编辑...要在屏幕上显示图像,我会执行以下操作:

JFrame frame = new JFrame("Something");
frame.setLayout(new FlowLayout()); //for example
JPanel panel = new JPanel();
panel.setLayout(null);

ImageIcon playerSprite = new ImageIcon("rute/to/file.png");
JLabel player = new JLabel(playerSprite);

panel.add(player);
player.setBounds(10,10,36,52); //for example

frame.getContentPane().add(panel);
frame.setVisible(true);

继续,如何旋转此 IconImage 或 JLabel。如果您认为更好,我可以使用其他方法来显示图像。如果解决方案是使用 Graphics2D,就像我看到的那样,我会很高兴有一个解决方案可以到达此类的对象,然后将旋转后的图像返回给 ImageIcon,因为当我尝试这个时......

ImageIcon imagePlayer = new ImageIcon("img/stand.png");
Image image = imagePlayer.getImage();
Graphics2D g = (Graphics2D)image.getGraphics();

在执行时,答案是这样的......

Exception in thread "main" java.lang.UnsupportedOperationException: getGraphics() not valid for images created with createImage(producer)

第二版...现在我正在使用这段代码。图像旋转但未旋转的旧图像仍保留在新图像下方的屏幕上。将名为 stand.png 的 png 图像放在同一目录下,您将看到它。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.lang.Math;
public class Test {
public static void main(String args[]) throws Exception {
try {
JFrame frame = new JFrame("Rotation Test");
frame.setBounds(10,10,1008,756);

BufferedImage bi = ImageIO.read(new File("stand.png"));
Graphics2D g = (Graphics2D)bi.getGraphics();
g.rotate(Math.toRadians(45),26,26);
g.drawImage(bi, 0, 0, null);
JLabel player = new JLabel(new ImageIcon(bi));
frame.getContentPane().add(player);

player.setBounds(0,0,100,100);
frame.setVisible(true);
} catch (IOException ex) {
System.out.println("Exception");
}
}
}

最佳答案

与其旋转组件本身,不如考虑旋转组件的内容。这exampleJPanel 中绘制旋转图像。

附录:在 exampleRotatableImage.getImage() 直接在内存中创建一个 BufferedImage,但您可以使用 ImageIO.read()从别处获取图像。 BufferedImage#createGraphics()如果您想修改图像,则支持,但您可能只想在旋转的图形上下文中绘制未修改的图像作为 paintComponent() 的一部分。

附录:您正在使用旋转副本在图像上绘画;相反,将图像绘制到旋转的图形上下文中:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test {

public static void main(String args[]) throws Exception {
JFrame frame = new JFrame("Rotation Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final BufferedImage bi = ImageIO.read(new File("img/stand.jpg"));
frame.add(new JPanel() {

@Override
public Dimension getPreferredSize() {
return new Dimension(bi.getWidth(), bi.getHeight());
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.rotate(Math.PI / 4, bi.getWidth() / 2, bi.getHeight() / 2);
g2.drawImage(bi, 0, 0, null);
}
});
frame.pack();
frame.setVisible(true);
}
}

关于java - 在 Java Swing 中旋转 JLabel 和 ImageIcon,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4287499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com