I’m trying to replace my Jlabels with a custom JComponent called PhotoComponent. So far, I’ve followed all the steps laid out from my instructors video on how to create the component. However, trying to replace the desired Jlabels with these two errors:
The constructor PhotoComponent() is undefined The method currentPic(ImageIcon) is undefined for the type new ActionListener(){}
This is the code for my custom component:
import javax.swing.ImageIcon; import javax.swing.JComponent; public class PhotoComponent extends JComponent { private ImageIcon pic; public PhotoComponent(){ } public PhotoComponent(ImageIcon p){ pic=p; this.setSize(pic.getIconWidth(),pic.getIconHeight()); } public void PaintComponent(Graphics g){ pic.paintIcon(this, g, 0, 0); } }
Advertisement
Answer
The method currentPic
doesn’t exist, you’ve defined currentPic
as an instance of PhotoComponent
, so I’m assuming you want to call a method on it.
If you want to create a new instance of PhotoComponent
, then you should be using
currentPic = new PhotoComponent(picList.get(pos))
But personally, I wouldn’t be doing this, instead I’d have a setIcon
method defined in PhotoComponent
so I could simply change the image it displays
public class PhotoComponent extends JComponent { private ImageIcon pic; public PhotoComponent() { } public PhotoComponent(ImageIcon p) { pic = p; this.setSize(pic.getIconWidth(), pic.getIconHeight()); } public void setIcon(ImageIcon icon) { pic = icon; repaint(); } public void PaintComponent(Graphics g) { pic.paintIcon(this, g, 0, 0); } }
Then, you’d change all the calls like currentPic(picList.get(pos));
to currentPic.setIcon(picList.get(pos));
How ever, PhotoComponent
is not really set up properly, as it won’t actually paint anything
First, setSize
should be avoided, as many components will simply ignore it and use the sizing hints, preferred
/minimum
/maximum
size, instead.
Another issues is PaintComponent
is defined incorrectly. Remember, Java is case sensitive, this means if you want to override a method, you need to spell it correctly.
You should replace it with something more like…
@Override protected void paintComponent(Graphics g) { super.paintComponent(g); pic.paintIcon(this, g, 0, 0); }
So, taking the above to comments into account, PhotoComponent
should look something more like…
public class PhotoComponent extends JComponent { private ImageIcon pic; public PhotoComponent() { } public PhotoComponent(ImageIcon p) { pic = p; } public void setIcon(ImageIcon icon) { pic = icon; revalidate() repaint(); } @Override public Dimension getPreferredSize() { if (pic == null) { return new Dimension(0, 0); } return new Dimension(pic.getIconWidth(), pic.getIconHeight()); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); pic.paintIcon(this, g, 0, 0); } }
Also, done use mainPic.add(currentPic);
, this isn’t how you should be using a JScrollPane
… and in fact, you only need to call mainPic.setViewportView(currentPic);
once, when you initialise the UI
I would recommend that you read and book mark