Как постепенно повернуть изображение в Swing?

Я написал простые cookieUtils, он имеет три функции для создания файла cookie, чтения cookie и удаления cookie.

var CookieUtils = {
    createCookie: function (name, value, expireTime) {
        expireTime = !!expireTime ? expireTime : (15 * 60 * 1000); // Default 15 min
        var date = new Date();
        date.setTime(date.getTime() + expireTime);
        var expires = "; expires=" + date.toGMTString();
        document.cookie = name + "=" + value + expires + "; path=/";
    },
    getCookie: function (name) {
        var value = "; " + document.cookie;
        var parts = value.split("; " + name + "=");
        if (parts.length == 2) {
            return parts.pop().split(";").shift();
        }
    },
    deleteCookie: function(name) {
        document.cookie = name +'=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
    }
};
13
задан BalusC 4 August 2010 в 13:16
поделиться

2 ответа

this.crossingP.paintComponent(comp2D);

Никогда этого не делайте! Ваша CrossingPane не добавляется ни к одному компоненту, поэтому repaint () не имеет никакого эффекта. Вы можете проверить это, добавив отпечатки в метод paintComponent (). Итак, вам нужно добавить CrossingPane в VisualizationPane:

setLayout(new BorderLayout());
add(crossingP, BorderLayout.CENTER);

Есть некоторые проблемы с центрированием изображения, но это не должно быть сложно исправить.

PS. Прочтите еще раз о макетах и ​​покраске.

4
ответ дан 1 December 2019 в 19:39
поделиться

В дополнение к полезным наблюдениям @ tulskiy я бы добавил два момента:

  1. Всегда создавайте свой графический интерфейс в потоке отправки событий , как показано ниже.

  2. sscce должен быть кратким, автономным, правильным (компилируемым), Пример . Для удобства не требуйте от других воссоздавать несколько общедоступных классов; используйте классы верхнего уровня (частный пакет) или вложенные классы. Поскольку это проблема с графикой, используйте общедоступное или синтетическое изображение, которое отражает вашу проблему.

В приведенном ниже примере paintComponent () изменяет преобразование графического контекста, чтобы произвести поворот. Обратите внимание, что операции выполняются в (очевидном) обратном порядке объявления: сначала центр изображения переводится в начало координат; во-вторых, изображение поворачивается; в-третьих, центр изображения переводится в центр панели. Вы можете увидеть эффект, изменив размер панели.

Приложение: См. Также этот альтернативный подход с использованием AffineTransform .

image

package overflow;

import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.swing.*;

/**
 * @see https://stackoverflow.com/questions/3371227
 * @see https://stackoverflow.com/questions/3405799
 */
public class RotateApp {

    private static final int N = 3;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.setLayout(new GridLayout(N, N, N, N));
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                for (int i = 0; i < N * N; i++) {
                    frame.add(new RotatePanel());
                }
                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}


class RotatePanel extends JPanel implements ActionListener {

    private static final int SIZE = 256;
    private static double DELTA_THETA = Math.PI / 90;
    private final Timer timer = new Timer(25, this);
    private Image image = RotatableImage.getImage(SIZE);
    private double dt = DELTA_THETA;
    private double theta;

    public RotatePanel() {
        this.setBackground(Color.lightGray);
        this.setPreferredSize(new Dimension(
            image.getWidth(null), image.getHeight(null)));
        this.addMouseListener(new MouseAdapter() {

            @Override
            public void mousePressed(MouseEvent e) {
                image = RotatableImage.getImage(SIZE);
                dt = -dt;
            }
        });
        timer.start();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.translate(this.getWidth() / 2, this.getHeight() / 2);
        g2d.rotate(theta);
        g2d.translate(-image.getWidth(this) / 2, -image.getHeight(this) / 2);
        g2d.drawImage(image, 0, 0, null);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        theta += dt;
        repaint();
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(SIZE, SIZE);
    }

}

class RotatableImage {

    private static final Random r = new Random();

    static public Image getImage(int size) {
        BufferedImage bi = new BufferedImage(
            size, size, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = bi.createGraphics();
        g2d.setRenderingHint(
            RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setPaint(Color.getHSBColor(r.nextFloat(), 1, 1));
        g2d.setStroke(new BasicStroke(size / 8));
        g2d.drawLine(0, size / 2, size, size / 2);
        g2d.drawLine(size / 2, 0, size / 2, size);
        g2d.dispose();
        return bi;
    }
}
25
ответ дан 1 December 2019 в 19:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: