I have spent a few days now trying to get the Graphics2D class to work within my code. I have it structured in such a way that when a click event is registered the call to repaint is done, however this only produces a nullpointer exception when it reaches the stage of calling repaint().
It is all working as expected when debugging and not called from within the paintComponent method, however when trying to call the code properly using paintComponent and repaint() to allow the Graphics2D class to display the lines to each point, It’s not working.
I have included the parts of my code that I am having difficulty getting to work. Any help whatsoever will really be appreciated. Thank you in advance.
Below is the GUI class that incldes my mouseListener.
public class GUI extends JPanel implements MouseListener {
private JLabel label;
public BufferedImage getImg() {
return img;
}
public void mouseClicked(java.awt.event.MouseEvent e) {
// TODO Auto-generated method stub
label = new JLabel();
//set point equal to the location of the mouse click on the image label
Point b = e.getPoint();
//place we are going to print the dots
segmentation.x = b.x; //gets the x coordinate
segmentation.y = b.y; //gets the y coordinate
System.out.println("x = " + segmentation.x);
System.out.println("y = " + segmentation.y);
//set the global img in the segmentation class equal to that of the one in the current tab
segmentation.setImg(tabbedPane.getSelectedIndex(), getImg());
segmentation.paintUpdate();
label = segmentation.getLabel();
//if i run this line of code the existing label I already have with simply vanish because of the paintComponent method not being called upon properly.
//tabbedPane.setComponentAt(tabbedPane.getSelectedIndex(), label);
}
This is the Segmentation class that includes the paintComponent method that I am having trouble calling upon properly.
public class Segmentation extends JLabel {
public int[] xpoints = new int[50];
public int[] ypoints = new int[50];
private int npoints = 0;
public int x;
public int y;
GeneralPath polyline;
Graphics2D g2;
JLabel label;
BufferedImage img;
ImageIcon icon;
public void paintUpdate() {
repaint();
}
public void setImg(int tabNum, BufferedImage img) {
this.img = img;
}
public GeneralPath createPath() {
// if (npoints > 0) {
polyline.moveTo(xpoints[0], ypoints[0]);
for(int i = 1; i < xpoints.length; i++) {
//add the position of the point to the respective x and y arrays
polyline.lineTo(xpoints[i], ypoints[i]);
}
// }
return polyline;
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("we're in the paint component method");
//set up for the new jlabel
label = new JLabel();
label.setIcon(new javax.swing.ImageIcon(img));
label.setHorizontalAlignment(JLabel.LEFT);
label.setVerticalAlignment(JLabel.TOP);
//add the position of the point to the respective x and y arrays
xpoints[npoints] = x;
ypoints[npoints] = y;
if (npoints == 0) {
JOptionPane.showMessageDialog(null, "Your first point has been added successfully");
}
else {
JOptionPane.showMessageDialog(null, "Your " + npoints + " rd/th" + " point has been added successfully");
}
polyline = createPath();
// Draws the buffered image to the screen.
g2.drawImage(img, 0, 0, this);
g2.draw(polyline);
npoints++;
}
Your Segmentation class has two JLabels, one the object of the class itself, which has a paintComponent override and is likely never used:
and the other a JLabel called label which is held by composition in the class which doesn’t have the method override which is in fact used and appears to be “shadowing” the class’s instance:
If you want paintComponent to be called, you’ll need to use the label object that in fact overrides that method.
Also you appear to be creating components within the
paintComponent(...)method (??). Never do that nor have program logic within this method.Edit:
To draw on an image, I usually override paintComponent and draw with its Graphics/Graphics2D object. For example: