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.
ReadingPixels
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;
addMouseMotionListener(mml);
}
protected void paintComponent(Graphics g) {
super.paintComponent(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) {
labels[0].setText(String.valueOf(x));
labels[1].setText(String.valueOf(y));
labels[2].setText(String.valueOf(a));
labels[3].setText(String.valueOf(r));
labels[4].setText(String.valueOf(g));
labels[5].setText(String.valueOf(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);
jc.setPreferredSize(d);
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.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new JScrollPane(test));
f.add(test.getLabels(), "Last");
f.setSize(500,400);
f.setLocation(200,200);
f.setVisible(true);
}
private MouseMotionListener mml = new MouseMotionAdapter() {
public void mouseMoved(MouseEvent e) {
Point p = e.getPoint();
showPixel(p);
}
};
}
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));
pic2.add(rightPic);
return fileR;
}
}
I'm not too sure how to connect this to my class. Can anyone help?
Thank you