Hi I found a class ReadingPixels someone wrote on the net which given an image it dispays the x,y,r,g,b values as the mouse is over the image. I have a separate class I want to add the panel to. I can add the panel to my frame however I think the problem is that the image is not being passed to the ReadingPixels class.


import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.swing.*;

public class ReadingPixels extends JPanel {
    BufferedImage image;
    JLabel[] labels;

    public ReadingPixels(BufferedImage image) {
        this.image = image;

    protected void paintComponent(Graphics g) {
        int x = (getWidth() - image.getWidth())/2;
        int y = (getHeight() - image.getHeight())/2;
        g.drawImage(image, x, y, this);

    public Dimension getPreferredSize() {
        return new Dimension(image.getWidth(), image.getHeight());

    private void showPixel(Point p) {
        int w = getWidth();
        int h = getHeight();
        int iw = image.getWidth();
        int ih = image.getHeight();
        Rectangle rect = new Rectangle(iw, ih);
        rect.x = (w - iw)/2;
        rect.y = (h - ih)/2;
        int x = 0, y = 0, a = 0, r = 0, g = 0, b = 0;
        if(rect.contains(p)) {
            x = p.x - rect.x;
            y = p.y - rect.y;
            int pixel = image.getRGB(x, y);
            a = (pixel >> 24) & 0xff;
            r = (pixel >> 16) & 0xff;
            g = (pixel >>  8) & 0xff;
            b = (pixel >>  0) & 0xff;
        setLabels(x, y, a, r, g, b);

    private void setLabels(int x, int y, int a, int r, int g, int b) {

    private JPanel getLabels() {
        labels = new JLabel[6];
        for(int i = 0; i < labels.length; i++) {
            labels[i] = new JLabel();
        Dimension d = new Dimension(35, 25);
        JPanel panel = new JPanel(new GridBagLayout());
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(2,2,2,2);
        addComponents("x =", labels[0], panel, gbc, d, 1.0, 0  );
        addComponents("y =", labels[1], panel, gbc, d, 0,   1.0);
        addComponents("a =", labels[2], panel, gbc, d, 1.0, 0  );
        addComponents("r =", labels[3], panel, gbc, d, 0,   0  );
        addComponents("g =", labels[4], panel, gbc, d, 0,   0  );
        addComponents("b =", labels[5], panel, gbc, d, 0,   1.0);
        return panel;

    private void addComponents(String s, JComponent jc, Container c,
                               GridBagConstraints gbc, Dimension d,
                               double weightx1, double weightx2) {
        gbc.weightx = weightx1;
        gbc.anchor = GridBagConstraints.EAST;
        c.add(new JLabel(s), gbc);
        gbc.weightx = weightx2;
        gbc.anchor = GridBagConstraints.WEST;
        c.add(jc, gbc);

    public static void main(String[] args) throws IOException {
        File file = new File("images/blackBear.jpg");
        BufferedImage image = javax.imageio.ImageIO.read(file);
        ReadingPixels test = new ReadingPixels(image);
        JFrame f = new JFrame("ReadingPixels");
        f.add(new JScrollPane(test));
        f.add(test.getLabels(), "Last");

    private MouseMotionListener mml = new MouseMotionAdapter() {
        public void mouseMoved(MouseEvent e) {
            Point p = e.getPoint();

How my class RunProgram works is that the user selects an image to open. So what I want is when the image is open I want the ReadPixels class to display the pixel information of that image that is loaded.

This is the code in my class that opens a picture on a panel

/** Method which takes an image file and opens it on a panel
     * @param f file to be opened
     * @return fileR
    public File openFileR(File f) {
        try {
            tmpImageR = ImageIO.read(f);
            Image toGray = (Image) tmpImageR;
            largeImageR = new ImageIcon(toGray);
            rightPic = new JLabel(largeImageR);
            rightPic.setBorder(new OvalBorder());
        } catch (IOException ex) {
        rightPic.setPreferredSize(new Dimension(350, 350));
        return fileR;

I'm not too sure how to connect this to my class. Can anyone help?
Thank you

8 Years
Discussion Span
Last Post by jooa

I have a class which implements a JPanel and when an image is loaded, it is loaded to that panel. Because this too is a panel I tried merging it will my image panel class however it doesn't work. I wanted a way for the lables to be added to the bottom of my panel. I tried doing this:

public File openFileL(File f) {
        try {
            tmpImageL = ImageIO.read(f);
            tmpImageL = createGrayscalePic(tmpImageL);
//            runGrabPixels(tmpImage);
            Image toGray = (Image) tmpImageL;
            largeImageL = new ImageIcon(toGray);
            leftPic = new JLabel(largeImageL);
            leftPic.setBorder(new OvalBorder());
        } catch (IOException ex) {
        leftPic.setPreferredSize(new Dimension(350, 350));
        PicturePanel p = new PicturePanel(tmpImageL);
        return fileL;

I have run the code again and the labels are added to the bottom of my screen but however only the values are shown when i scroll over those lables. It seems that the picture is not on the same panel therefore when I scroll over it nothing happens. How could I rectify this?

Thank you

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.