JPanel 绘制 BufferedImage

Posted

技术标签:

【中文标题】JPanel 绘制 BufferedImage【英文标题】:JPanel draw BufferedImage 【发布时间】:2022-01-21 17:40:14 【问题描述】:

我在画BufferedImage时遇到问题,很难描述,所以你可以在视频中看到:https://www.youtube.com/watch?v=9K-QTKHcOYA

这是我的代码:

JPanel

@Override
public void mouseMoved(MouseEvent e) 
    if(Tool.selectedTool != null)
        Tool.selectedTool.onPaintingAreaMouseMoved(e.getX(),e.getY(),z);


@Override
public void onPaintingAreaMouseMoved(int x, int y, int z) 
    if(clicks == 1)
        curve.controlPoints[1] = new Point(x, y, z);
        PaintingArea.paintingArea.refresh();
    

因为一个错误,我决定不在这里贴出我的曲线类的代码,但是我查了一下,没有错误。

JPanel 类中

public void refresh()
    axis = new int[width * height];
    for (int i = 0; i < axis.length; i++)
        axis[i] = background;
    for(int i = 0; i < Line.lines.size(); i++) 
        Point[] points = Line.lines.get(i).getPoints();
        for(int m = 0; m < points.length; m++)
            axis[points[m].x + width*points[m].y] = 0;
    
    repaint();


@Override
protected void paintComponent(Graphics g) 
    super.paintComponent(g);
    setSize(width,height);
    BufferedImage image = new BufferedImage( width, height, BufferedImage.TYPE_INT_RGB);
    image.setRGB(0,0, width, height, axis,0, 1);
    g.drawImage(image,0,0,image.getWidth(),image.getHeight(),null);

谁能告诉我我做错了什么?

【问题讨论】:

Oracle 有一个有用的教程,Creating a GUI With Swing。跳过 Netbeans 部分。 Performing Custom Painting 部分将向您展示如何执行自定义绘画。 我不使用 netbeans 也许我也应该上传 Line.getPoints() 方法的代码? “也许我也应该上传 Line.getPoints() 方法的代码?” 最好的办法是添加一个minimal reproducible example。跨度> paintComponent方法至少有两个问题。 1) setSize(width,height); 这可能会改变绘图区域的大小,这将调用对repaint() 的调用,这将导致无限循环。 2) g.drawImage(image,0,0,image.getWidth(),image.getHeight(),null); A JPanel 是一个 ImageObserver,所以应该(null)应该是g.drawImage(image,0,0,image.getWidth(),image.getHeight(),this);。 --- 如果更改都不能解决问题,请发布 MRE,我会更仔细地查看。 【参考方案1】:
    JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    panel.add(menubar, BorderLayout.NORTH);
    panel.add(toolbar, BorderLayout.WEST);
    panel.add(new PaintingArea(), BorderLayout.CENTER);

    add(panel);
    pack();
    setSize(800,700);
    setVisible(true);

【讨论】:

以上是关于JPanel 绘制 BufferedImage的主要内容,如果未能解决你的问题,请参考以下文章

在 JFrame 中将图像绘制到 JPanel

如何将 BufferedImage 绘制到 JPanel

绘制使用自己的 Painter 创建的 JPanel

在现有的 JPanel 上绘制 JLayeredPane

事件发生后如何重新绘制JPanel

Java Swing:在 JPanel 的组件下绘制?