我试着做些简单的事情。我一直很难让Java GUI正常工作。我希望在写入像素时更新它们;但是for
循环的绘图似乎没有被绘制。需要调用什么样的更新方法才能让我的BufferedImage
出现?
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.image.BufferedImage;
public class DirectDrawDemo {
public static void main(String[] args) {
int width = 640;
int height = 480;
Frame frame = new Frame("Direct draw demo");
BufferedImage canvas = new BufferedImage(
width, height,
BufferedImage.TYPE_INT_RGB);
Panel panel = new Panel();
panel.setPreferredSize(new Dimension(width, height));
frame.add(panel);
frame.setVisible(true);
frame.setResizable(false);
panel.setBackground(Color.PINK);
for (int x = 1; x < width; x++)
for (int y = 0; y < height; y++)
canvas.setRGB(x, y, rgbtoint(0, 255, 0));
System.out.println(canvas.getRGB(0, 0) != canvas.getRGB(1, 0));
panel.paint(canvas.getGraphics());
panel.repaint();
frame.pack();
}
static int rgbtoint(int red, int green, int blue) {
int rgb = red;
rgb = (rgb << 8) + green;
rgb = (rgb << 8) + blue;
return rgb;
}
static int rgbtored(int rgb) {
return (rgb >> 16) & 0xFF;
}
static int rgbtogreen(int rgb) {
return (rgb >> 8) & 0xFF;
}
static int rgbtoblue(int rgb) {
return rgb & 0xFF;
}
}
发布于 2015-02-18 21:14:06
基本上,你所做的是在你的图像上画你的面板的组件,而不是相反的方式。
您似乎认为paint(Graphics g)
方法将g
的内容放在窗口中。它没有,它所做的是在g
上画东西。也不应该被直接调用。通常的工作方式是创建继承自Panel
(或其他组件)的类,并重写其paint()
方法,通过调用传递的Graphics
对象的绘图方法,添加在其中绘制内容的操作。在这种情况下,您可能会调用g.drawImage(...)
。
在组件上调用repaint()
时,将以表示窗口“画布”的图形作为其参数来调用其paint()
方法,因此您添加到paint()
中的任何内容都将在其上绘制。
要了解更多信息,请从绘图原语的甲骨文图层开始,当您了解paint()
方法如何工作时,请转到绘图图像。
发布于 2015-02-18 21:20:00
为了扩展RealSkeptic的答案,下面是一个重写paintComponent
方法以添加自定义绘图的示例。
public static class MyPanel extends JPanel {
private int width;
private int height;
public MyPanel(int width, int height) {
this.width = width;
this.height = height;
setPreferredSize(new Dimension(width, height));
setBackground(Color.PINK);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
BufferedImage canvas = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 1; x < width; x++) {
for (int y = 0; y < height; y++) {
canvas.setRGB(x, y, new Color(0, 255, 0).getRGB());
}
}
g.drawImage(canvas, 0, 0, null);
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("Direct draw demo");
JPanel panel = new MyPanel(640, 480);
frame.add(panel);
frame.setResizable(false);
frame.pack();
frame.setVisible(true);
}
https://stackoverflow.com/questions/28593707
复制相似问题