首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >BufferedImage.setRGB()不更新

BufferedImage.setRGB()不更新
EN

Stack Overflow用户
提问于 2015-02-18 20:53:22
回答 2查看 897关注 0票数 1

我试着做些简单的事情。我一直很难让Java GUI正常工作。我希望在写入像素时更新它们;但是for循环的绘图似乎没有被绘制。需要调用什么样的更新方法才能让我的BufferedImage出现?

代码语言:javascript
运行
复制
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;
    }
}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-18 21:14:06

基本上,你所做的是在你的图像上画你的面板的组件,而不是相反的方式。

您似乎认为paint(Graphics g)方法将g的内容放在窗口中。它没有,它所做的是在g上画东西。也不应该被直接调用。通常的工作方式是创建继承自Panel (或其他组件)的类,并重写其paint()方法,通过调用传递的Graphics对象的绘图方法,添加在其中绘制内容的操作。在这种情况下,您可能会调用g.drawImage(...)

在组件上调用repaint()时,将以表示窗口“画布”的图形作为其参数来调用其paint()方法,因此您添加到paint()中的任何内容都将在其上绘制。

要了解更多信息,请从绘图原语的甲骨文图层开始,当您了解paint()方法如何工作时,请转到绘图图像

票数 2
EN

Stack Overflow用户

发布于 2015-02-18 21:20:00

为了扩展RealSkeptic的答案,下面是一个重写paintComponent方法以添加自定义绘图的示例。

代码语言:javascript
运行
复制
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);
}

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28593707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档