Во-первых, это первая неделя, когда я использую качели, извините, если мой вопрос слишком очевиден. Кроме того, мне нужны решения, в которых используются стандартные библиотеки 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");
        }
    }
}
7
dgnin 26 Ноя 2010 в 20:43
+1 за компилируемый пример; в качестве упражнения попробуйте завершить его, используя мой пример RotatableImage.getImage() или @ camickr Rotated Icon.
 – 
trashgod
27 Ноя 2010 в 23:10

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);
    }
}
11
Community 23 Май 2017 в 15:34
Я понимаю, что ключ к разгадке заключается в использовании Graphics2D, но в этом примере я не вижу, как перейти к этому классу из объекта ImageIcon. Фактически, я только что отредактировал основной пост, чтобы показать, что я получил исключение, пытаясь его. Спасибо за помощь.
 – 
dgnin
27 Ноя 2010 в 10:47
@ nin1987: Я уточнил выше.
 – 
trashgod
27 Ноя 2010 в 16:49
Хорошо, я не понимаю весь ваш код, и, вероятно, есть причина, по которой мой не работает, но, по крайней мере, проблема немного решена. Я редактирую свой первый пост с новым кодом, который я написал, и с ним изображение вращается, но также отображается исходное изображение без поворота. Я устал создавать новый BufferedImage (того же размера и того же типа) и рисовать там поворот, но он не работает (рисует только исходное неповорачиваемое изображение).
 – 
dgnin
27 Ноя 2010 в 20:15
1
@ nin1987: Отлично! Теперь попробуйте изменить параметры на rotate(), чтобы увидеть эффект.
 – 
trashgod
28 Ноя 2010 в 22:17

Поскольку решения, которые я нашел, не работают или я их не понимаю

Что ж, если вы их не понимаете, тогда вам следует опубликовать свой SSCCE (http://sscce.org), демонстрирующий ваш тестовый код. Тогда, может быть, кто-нибудь сможет объяснить, как работает код.

Я сомневаюсь, что вы сможете понять любой новый код, который мы можем опубликовать, поскольку концепции поворота изображения или значка одинаковы.

Поскольку я позиционирую изображение, выполняя setBounds на JLabel

Почему вы используете setBounds (). Вам следует использовать диспетчер компоновки, чтобы не беспокоиться об этом.

Редактировать:

Возможно, вы можете использовать повернутый значок.

3
camickr 27 Ноя 2010 в 19:17
Я должен показать волейбольную площадку с игроками, движущимися внутри, вращающимися, меняющими спрайт и т. Д., Тогда я должен постоянно работать с абсолютными позициями. В этой ситуации я думаю, что setLayout (null) - хороший вариант, поправьте меня, если я ошибаюсь.
 – 
dgnin
27 Ноя 2010 в 10:24
Тем не менее, я отредактировал основной пост, добавив несколько примеров (надеюсь, это можно считать SSCCE: D), иллюстрирующих мою проблему. Спасибо.
 – 
dgnin
27 Ноя 2010 в 10:48
@ nin1987, как вы считаете, что это SSCCE? Как этот код компилируется? Смотрите мою правку.
 – 
camickr
27 Ноя 2010 в 19:16
Приходится использовать стандартные библиотеки.
 – 
dgnin
27 Ноя 2010 в 19:58
@ nin1987, поэтому вы посмотрите на код и поймете, как он работает, а затем измените код для своих целей. Не существует "стандартной библиотеки", которая бы делала то, что вы хотите. Вам нужно использовать различные методы стандартных библиотек для достижения желаемой цели. Вот почему в моем первом предложении говорилось, что вам нужно опубликовать код, который вы пытались использовать.
 – 
camickr
27 Ноя 2010 в 20:04