在以下程序中,我将一些图像放置在面板中,并相对于该面板对其进行转换。但是,第一次绘制gui时,它将相对于窗口而不是面板的坐标执行初始绘制操作。除了放置在错误的位置之外,所有图像都相互堆叠。如何避免这种情况?所有后续的重新绘制均正确,但不是初始设置。
在将窗口设置为可见后,我已经尝试在main方法中重新粉刷面板。
我正在尝试通过创建布尔标志来简化解决方案,该布尔标志将在触发ActionListener时发生变化。这将使我能够在最初运行时更改paintComponent()方法的行为,并且我只能使用窗口坐标系,但这令人难以置信,而且我怀疑有更好的解决方案。
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
import java.awt.image.*;
import javax.swing.*;
public class GraphicsCreation extends JFrame {
static int frame;
static JPanel images;
static final BufferedImage[] IMAGE = {Image.getImage(Image.imageArr1), Image.getImage(Image.imageArr2), Image.getImage(Image.imageArr3)};
boolean built = false;
public GraphicsCreation() {
final int MAXFRAMES = 5;
JPanel navBar = new JPanel();
navBar.setLayout(new BorderLayout());
JButton next = new JButton("NEXT >>");
JLabel label = new JLabel(" ", SwingConstants.CENTER);
frame = 1;
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
frame++;
for (Component image : images.getComponents()) {
image.repaint();
}
}
};
next.addActionListener(listener);
images = new JPanel();
images.setLayout(new GridLayout(0, 2));
JPanel imagePanel1 = new ImagePanel(0);
JPanel imagePanel2 = new ImagePanel(1);
images.add(imagePanel1);
images.add(imagePanel2);
images.validate();
this.setLayout(new BorderLayout());
this.add(next, BorderLayout.NORTH);
this.add(images, BorderLayout.CENTER);
}
public static void main(String args[]) {
GraphicsCreation gc = new GraphicsCreation();
gc.setMinimumSize(new Dimension(400, 300));
gc.setLocationRelativeTo(null);
gc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gc.setResizable(false);
gc.setVisible(true);
}
class ImagePanel extends JPanel {
AffineTransform currentTransform;
int img;
public ImagePanel(int img) {
super();
this.img = img;
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setPaint(Color.BLACK);
g2.fillRect(0, 0, getWidth(), getHeight());
//applyWindowToViewportTransformation(g2, -75, 75, -75, 75, true);
double width = getWidth();
double height = getHeight();
switch (frame) {
case 1:
currentTransform = new AffineTransform();
g2.setTransform(currentTransform);
break;
case 2:
g2.setTransform(currentTransform);
g2.translate((-5), 7);
break;
case 3:
g2.setTransform(currentTransform);
g2.rotate(Math.toRadians(-45), width / 2, height / 2);
break;
case 4:
g2.setTransform(currentTransform);
g2.rotate(Math.toRadians(90), width / 2, height / 2);
break;
case 5:
g2.setTransform(currentTransform);
g2.translate((width - width * 2) / 2, (height - height * 0.5) / 2);
g2.scale(2, 0.5);
break;
}
currentTransform = g2.getTransform();
g2.translate(width / 2 - (IMAGE[img].getWidth() / 2), height / 2 - (IMAGE[img].getHeight() / 2));
System.out.print(g2.getTransform().getTranslateX() + " ");
System.out.println(g2.getTransform().getTranslateY());
g2.drawImage(IMAGE[img], 0, 0, this);
}
}
}
程序最初运行时的外观:
程序运行时的外观:
按5次下一个按钮可以达到正确的外观。
如果需要,这里是Image类,但是它仅在创建要使用的缓冲图像时才有意义。
import java.awt.Color;
import java.awt.image.BufferedImage;
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author Dylan Veraart
*/
public class Image {
private static int bg = Color.WHITE.getRGB();
private static int fg1 = Color.MAGENTA.getRGB();
static String name1 = "Rectangle";
static int[][] imageArr1 = {
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,fg1,fg1,fg1,fg1,fg1,fg1,fg1,fg1,fg1,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,fg1,fg1,fg1,fg1,fg1,fg1,fg1,fg1,fg1,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,fg1,fg1,fg1,fg1,fg1,fg1,fg1,fg1,fg1,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,fg1,fg1,fg1,fg1,fg1,fg1,fg1,fg1,fg1,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,fg1,fg1,fg1,fg1,fg1,fg1,fg1,fg1,fg1,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,fg1,fg1,fg1,fg1,fg1,fg1,fg1,fg1,fg1,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg}
};
private static int fg2=Color.BLACK.getRGB();
static String name2 = "lowercaseF";
static int[][] imageArr2 = {
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,fg2,fg2,fg2,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,fg2,fg2,fg2,fg2,fg2,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,fg2,fg2,fg2,fg2,fg2,fg2,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,fg2,fg2,fg2,bg,bg,fg2,fg2,fg2,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,fg2,fg2,bg,bg,bg,bg,fg2,fg2,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,fg2,fg2,bg,bg,bg,bg,fg2,fg2,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,fg2,fg2,bg,bg,bg,bg,fg2,fg2,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,fg2,fg2,bg,bg,bg,fg2,fg2,fg2,fg2,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,fg2,fg2,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,fg2,fg2,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,bg,fg2,fg2,fg2,bg,bg,fg2,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,fg2,fg2,fg2,fg2,fg2,fg2,fg2,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,fg2,fg2,fg2,fg2,fg2,fg2,fg2,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,fg2,fg2,fg2,fg2,fg2,fg2,fg2,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,bg,fg2,fg2,fg2,bg,bg,fg2,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,fg2,fg2,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,fg2,fg2,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,fg2,fg2,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,fg2,fg2,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,fg2,fg2,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,fg2,fg2,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,fg2,fg2,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,fg2,fg2,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg2,fg2,fg2,fg2,fg2,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg}
};
private static int fg3=Color.GREEN.getRGB();
static String name3 = "circles";
static int[][] imageArr3 = {
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg3,fg3,fg3,fg3,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg3,fg3,fg3,fg3,fg3,fg3,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg3,fg3,fg3,fg3,fg3,fg3,fg3,fg3,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg3,fg3,fg3,fg3,fg3,fg3,fg3,fg3,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg3,fg3,fg3,fg3,fg3,fg3,fg3,fg3,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg3,fg3,fg3,fg3,fg3,fg3,fg3,fg3,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg3,fg3,fg3,fg3,fg3,fg3,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,fg3,fg3,fg3,fg3,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,fg3,fg3,fg3,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,fg3,fg3,fg3,fg3,fg3,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,fg3,fg3,fg3,fg3,fg3,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,fg3,fg3,fg3,fg3,fg3,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,fg3,fg3,fg3,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg},
{bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg,bg}
};
public static BufferedImage getImage(int[][] arr){
BufferedImage image = new BufferedImage(25, 25, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < 25; x++) {
for (int y = 0; y < 25; y++) {
image.setRGB(x, y, arr[y][x]);
} // End for y.
} // End for x.
return image;
}
}