在 JFrame 中,我有一些按钮和 BufferedImgae,它们将用于使用我自己的方法在其上绘制一些形状和图片(drawLine、逐像素绘制光栅图片等)。 这是我向 JFrame 添加内容的方法
public class Main extends javax.swing.JPanel {
JPanel panel;
JFrame fr;
Graphics2D g2;
ImageIcon icon;
BufferedImage img;
public void init()
{
fr = new JFrame("Lab 2");
fr.setMinimumSize(new Dimension(1350, 650));
fr.setMaximumSize(fr.getMinimumSize());
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel glowny = new JPanel(new BorderLayout());
glowny.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
glowny.add(getBorderCenter(), BorderLayout.CENTER);
fr.add(glowny);
fr.pack();
fr.setVisible(true);
}
private JScrollPane getBorderCenter()
{
img = new BufferedImage( fr.getWidth()-40, fr.getHeight()-40-50, BufferedImage.TYPE_INT_RGB); //20+20 odstępy w glowny, 50 - szerokość paska z guzikami
icon = new ImageIcon(img);
return new JScrollPane(new JLabel(icon));
}
public static void main(String [] args)
{
Main m = new Main();
m.init();
}
}
然后我尝试使用双缓冲在 BufferedImage 上绘制。 以下示例将 BufferedImage 颜色从黑色(当前)更改为白色。
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("paintComponent");
WritableRaster raster = img.getRaster();
DataBuffer db = raster.getDataBuffer();
int[] pixels = ((DataBufferInt)db).getData();
int adres = 0;
for (int y = 0; y < img.getHeight(); y++)
{
adres = y * img.getWidth();
for (int x = 0; x < img.getWidth(); x++)
{
pixels[adres] = 16777215;
adres += 1;
}
}
Graphics2D g2dComponent = (Graphics2D) g;
g2dComponent.drawImage(img, null, 0, 0); // draw buffer on screen
}
据我所知,repaint() 强制调用 paintComponent()。问题是我如何调用 repaint() 并不重要
fr.repaint();
glowny.repaint();
repaint();
它从未被调用过。
最佳答案
您永远不会将 Main
添加到 GUI。您需要将覆盖 paintComponent 的 JPanel,即 this
添加到 GUI 的某处,但您没有这样做。例如,您需要类似以下内容的地方:
someComponentShownInGui.add(this);
我会去掉 glowny 变量,而是使用 this
。
即,
public void init()
{
fr = new JFrame("Lab 2");
fr.setMinimumSize(new Dimension(1350, 650));
fr.setMaximumSize(fr.getMinimumSize());
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// JPanel glowny = new JPanel(new BorderLayout());
// glowny.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
// glowny.add(getBorderCenter(), BorderLayout.CENTER);
// fr.add(glowny);
setLayout(new BorderLayout();
setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
add(getBorderCenter(), BorderLayout.CENTER);
fr.add(this);
fr.pack();
fr.setVisible(true);
}
请注意,添加到绘图 JPanel 中的任何组件都会覆盖其图像,因此您可能需要制作一些非不透明的。
关于java - 未调用 paintComponent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26959148/