Во-первых, это первая неделя, когда я использую качели, извините, если мой вопрос слишком очевиден. Кроме того, мне нужны решения, в которых используются стандартные библиотеки java, так как это для домашних заданий, и мне не разрешено использовать странные библиотеки.
Я использую JLabel с ImageIcon для отображения изображений в JFrame. Теперь я хочу повернуть изображение на экране под произвольным углом. Я кое-что нашел о Graphics2D, но не могу этого сделать.
Поскольку решения, которые я нашел, не работают или я их не понимаю, меня интересует любое решение для поворота ImageIcon или JLabel. Поскольку я позиционирую изображение, выполняя setBounds на JLabel, поворот 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)
2-е издание ... Сейчас работаю с этим кодом. Изображение поворачивается, но старое неотвернутое изображение все еще остается на экране под новым. Поместите изображение в формате PNG с именем stand.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");
}
}
}
2 ответа
Вместо поворота самого компонента рассмотрите возможность поворота содержимого компонента. Этот пример рисует повернутое изображение в JPanel
.
Приложение: в примере RotatableImage.getImage()
создается BufferedImage
непосредственно в памяти, но вы можете использовать ImageIO.read()
< / a>, чтобы получить изображение откуда-нибудь. 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);
}
}
rotate()
, чтобы увидеть эффект.
Поскольку решения, которые я нашел, не работают или я их не понимаю
Что ж, если вы их не понимаете, тогда вам следует опубликовать свой SSCCE (http://sscce.org), демонстрирующий ваш тестовый код. Тогда, может быть, кто-нибудь сможет объяснить, как работает код.
Я сомневаюсь, что вы сможете понять любой новый код, который мы можем опубликовать, поскольку концепции поворота изображения или значка одинаковы.
Поскольку я позиционирую изображение, выполняя setBounds на JLabel
Почему вы используете setBounds (). Вам следует использовать диспетчер компоновки, чтобы не беспокоиться об этом.
Редактировать:
Возможно, вы можете использовать повернутый значок.
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.
RotatableImage.getImage()
или @ camickrRotated Icon
.