【问题标题】:Java BufferedImage / JPanel not updating new black pixel rows using JButtonJava BufferedImage / JPanel 不使用 JButton 更新新的黑色像素行
【发布时间】:2015-06-11 02:18:04
【问题描述】:

基本上,我在缓冲图像中有一个(宽度 x 高度)大小的像素,并且想在缓冲图像/JPanel 中绘制简单的水平黑色线条。每次单击按钮都会创建一条新的水平线。

虽然按钮事件到达了updateImage()函数,并且Log输出表明系统调用了paintComponent(Graphics g)。没有更新发生。唯一一次绘制 Line 是在构造函数初始化时。每次单击按钮时屏幕都没有更新;只有最初的一行是从构造函数中的测试调用中绘制的。

最终产品是模拟打印机。

谢谢。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JPanel;

public class ViewPaper extends JPanel {

    private BufferedImage buffer = null;
    private final int width = 384;
    private int height = 500;

    private final static Logger LOG = Logger.getLogger(ViewPaper.class
            .getName());

    public ViewPaper() {
        super();
        buffer = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        printDotLine(50);
        LOG.log(Level.INFO, "ViewPaper: Load Successful.");
    }


    /* Update BufferedImage then repaint to screen.
     * Note. A Top Level repaint() is also called
     * and according to log the paintComponent is
     * called but nothing is happening! 
     */
    public void updateImage(int y) {
        printDotLine(y);
        repaint();
       LOG.log(Level.INFO, "ViewPaper:     updateImage(); Called.");
    }


    /* Update JPanel with updated buffer. */
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create();
        g2d.drawImage(buffer, 0, 0, this);
        g2d.dispose();
        LOG.log(Level.INFO, "ViewPaper: paintComponent(); Called.");
    }


    /* Sets row of pixels in buffer to black.*/
    public void printDotLine(int y) {
        for (int x = 0; x < width; x++) {
            buffer.setRGB(x, y, Color.BLACK.getRGB());
        }
        LOG.log(Level.INFO, "ViewPaper: printDotLine(); Called.");
    }

}

【问题讨论】:

  • 您尚未包含用于更新 UI 的按钮。代码工作正常(我添加了MouseListener,每次点击都会更新)。这表明问题出在您未提供的代码中的其他位置

标签: java swing jpanel bufferedimage paintcomponent


【解决方案1】:

您几乎回答了自己的问题,但忘记包含实际按钮。 它应该是这样的(几乎 - 不应该使用静态 - 这只是代码的简单示例/改进):

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ViewPaper extends JPanel {

    static ViewPaper viewPaper;
    static int line=50;
    public static void main(String args[])
    {
            JFrame frame=new JFrame("View Paper");
            viewPaper=new ViewPaper();
            frame.add(viewPaper);
            JButton button=new JButton("Click Me!");
            frame.add(button,BorderLayout.SOUTH);
            button.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    viewPaper.updateImage(line++);
                }
            });

            frame.setSize(300,500);
            frame.setVisible(true);
    }
    private BufferedImage buffer = null;
    private final int width = 384;
    private int height = 500;

    private final static Logger LOG = Logger.getLogger(ViewPaper.class
            .getName());

    public ViewPaper() {
        super();
        buffer = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        printDotLine(50);
        LOG.log(Level.INFO, "ViewPaper: Load Successful.");
    }


    /* Update BufferedImage then repaint to screen.
     * Note. A Top Level repaint() is also called
     * and according to log the paintComponent is
     * called but nothing is happening! 
     */
    public void updateImage(int y) {
        printDotLine(y);
        repaint();
    }


    /* Update JPanel with updated buffer. */
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create();
        g2d.drawImage(buffer, 0, 0, this);
        g2d.dispose();
        LOG.log(Level.INFO, "ViewPaper: paintComponent(); Called.");
    }


    /* Sets row of pixels in buffer to black.*/
    public void printDotLine(int y) {
        for (int x = 0; x < width; x++) {
            buffer.setRGB(x, y, Color.BLACK.getRGB());
        }
        LOG.log(Level.INFO, "ViewPaper: Update Received.");
    }

}

【讨论】:

  • “虽然按钮事件到达了updateImage()函数,并且Log输出表明系统调用了paintComponent(Graphics g)”——这似乎表明示例代码不是 OP 正在使用的代码 ...
  • 谢谢你们帮了我很大的忙。我讨厌理论上的代码应该可以工作而你什么也得不到。我将尝试找出为什么即使调用了父按钮调用也不能正常工作。
  • 今天发现屏幕上的 ViewPaper JPanel 类不是正在更新的类,而是第二个实例正在更新,它没有连接到 JFrame。菜鸟的错误,但你去吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 2014-05-28
  • 2017-12-27
相关资源
最近更新 更多