程序未访问扩展 JPanel 类的方法 paintComponent()

Program not accessing method paintComponent() of extended JPanel class(程序未访问扩展 JPanel 类的方法 paintComponent())

本文介绍了程序未访问扩展 JPanel 类的方法 paintComponent()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是 JFrame

package client.connection;

import java.awt.Dimension;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import javax.swing.JFrame;


class DrawFrameRemoteControl extends JFrame
{
    private DrawPanelRemoteControl imagePanel;
    private ClientRemoteControlConnection clientRemoteControlConnection;
    private ObjectInputStream clientInputStream;
    private ObjectOutputStream clientOutputStream;
    private Dimension imageDimension;
    private Dimension serverDimension;

    public DrawFrameRemoteControl(Dimension imageDimension,ClientRemoteControlConnection clientRemoteControlConnection,ObjectInputStream clientInputStream,ObjectOutputStream clientOutputStream,Dimension serverDimension)
    {
        super("Remote Desktop Control");

        this.clientRemoteControlConnection=clientRemoteControlConnection;
        this.clientInputStream=clientInputStream;
        this.clientOutputStream=clientOutputStream;
        this.imageDimension=imageDimension;
        this.serverDimension=serverDimension;

        imagePanel=new DrawPanelRemoteControl(imageDimension);
        add(imagePanel);


        setSize(imageDimension.width,imageDimension.height);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
        setLocationRelativeTo(null);
    }

    void drawNewImageGrayscale(byte[] array)
    {
        imagePanel.setNewImageGrayscale(array);
        imagePanel.repaint();
    }
}

这是扩展的 JPanel 类-

And this is the extended JPanel class-

package client.connection;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.Transparency;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.ComponentColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
import java.awt.image.MemoryImageSource;
import java.awt.image.Raster;
import java.awt.image.SampleModel;
import java.awt.image.WritableRaster;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;

class DrawPanelRemoteControl extends JPanel
{
    private byte[] byteArray=null;
    private Image image;
    private JLabel imageLabel=new JLabel();
    private Dimension imageDimension;

    public DrawPanelRemoteControl(Dimension imageDimension)
    {
        this.imageDimension=imageDimension;
        add(imageLabel);
    }

    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        System.out.println(".");
        if(byteArray!=null)
        {
            image=getGrayscaleImageFromArray(byteArray,imageDimension.width,imageDimension.height);
            imageLabel.setIcon(new ImageIcon(image));
        }
    }

    private Image getGrayscaleImageFromArray(byte[] buffer, int width, int height)
    {
        ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
        int[] nBits = { 8 };
        ColorModel cm = new ComponentColorModel(cs, nBits, false, true,Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
        SampleModel sm = cm.createCompatibleSampleModel(width, height);
        DataBufferByte db = new DataBufferByte(buffer, width * height);
        WritableRaster raster = Raster.createWritableRaster(sm, db, null);
        BufferedImage result = new BufferedImage(cm, raster, false, null);
        return result;
    }

    void setNewImageGrayscale(byte[] array)
    {
        this.byteArray=array;
        this.intArray=null;
    }
}

我已经尝试调试过代码,即使 imagePanel.repaint() 被执行了很多次,程序始终没有到达 paintComponent() 方法DrawPanelRemoteControl 类.

I have tried debugging the code, even though imagePanel.repaint() is being executed many times, the program never reaches the paintComponent() method of DrawPanelRemoteControl class.

谁能告诉我为什么会发生这种情况?它与 imageDimension 对象有什么关系吗?

Can anybody give me any idea why this might be happening? Has it got anything to do with the imageDimension object?

附加信息:main() 方法中,创建了一个 DrawFrameRemoteControl 对象,它是 drawNewImageGrayscale(byte[] arr) 方法每秒从 main() 更新.

Additional Information : In main() method, a DrawFrameRemoteControl object is created and it's drawNewImageGrayscale(byte[] arr) method is being updated from main() every second.

推荐答案

不清楚为什么要传递 byte[],但看起来你想更新组件的 带有灰色缩略图的图标.下面的示例从现有示例图标创建灰度图标并使用 setIcon() 进行更新.类似的方法适用于任何 Image.另请参阅建议 ColorConvertOp 的 example 和此 示例更新整个组件而不是图标.

It's not clear why you're passing around byte[], but it looks like you want to update a component's Icon with a gray thumbnail. The example below creates grayscale icons from existing sample icons and uses setIcon() to do the update. A similar approach works with any Image. See also this example that suggests ColorConvertOp, and this example that updates whole components rather than icons.

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.Timer;
import javax.swing.UIManager;

/**
 * @see https://stackoverflow.com/a/12228640/230513
 * @see https://stackoverflow.com/a/7935040/230513
 */
public class GrayIcons extends JPanel {

    private List<Icon> list = new ArrayList<Icon>();
    private List<JToggleButton> buttons = new ArrayList<JToggleButton>();
    private Timer timer = new Timer(1000, new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            update();
        }
    });

    public GrayIcons() {
        this.setLayout(new GridLayout(1, 0));
        list.add(getGray(UIManager.getIcon("OptionPane.errorIcon")));
        list.add(getGray(UIManager.getIcon("OptionPane.informationIcon")));
        list.add(getGray(UIManager.getIcon("OptionPane.warningIcon")));
        list.add(getGray(UIManager.getIcon("OptionPane.questionIcon")));
        for (Icon icon : list) {
            JToggleButton jtb = new JToggleButton(icon);
            buttons.add(jtb);
            this.add(jtb);
        }
        timer.start();
    }

    private void update() {
        Collections.shuffle(list);
        int index = 0;
        for (JToggleButton b : buttons) {
            b.setIcon(list.get(index++));
        }
    }

    /**
     * @see https://stackoverflow.com/q/5830533/230513
     * @see https://stackoverflow.com/a/3106550/230513
     */
    private Icon getGray(Icon icon) {
        final int w = icon.getIconWidth();
        final int h = icon.getIconHeight();
        GraphicsEnvironment ge =
            GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice gd = ge.getDefaultScreenDevice();
        GraphicsConfiguration gc = gd.getDefaultConfiguration();
        BufferedImage image = gc.createCompatibleImage(w, h);
        Graphics2D g2d = image.createGraphics();
        g2d.setPaint(new Color(0x00f0f0f0));
        g2d.fillRect(0, 0, w, h);
        icon.paintIcon(null, g2d, 0, 0);
        BufferedImage gray = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY);
        ColorConvertOp op = new ColorConvertOp(
            image.getColorModel().getColorSpace(),
            gray.getColorModel().getColorSpace(), null);
        op.filter(image, gray);
        return new ImageIcon(gray);
    }

    private void display() {
        JFrame f = new JFrame("GrayIcons");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new GrayIcons().display();
            }
        });
    }
}

这篇关于程序未访问扩展 JPanel 类的方法 paintComponent()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:程序未访问扩展 JPanel 类的方法 paintComponent()

基础教程推荐