drawing oval in a jpanel
its supposed to draw an oval on MouseClicked:
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
public class PaintPad extends JPanel implements MouseListener {
private int mouseX, mouseY;
public static void main(String args[]) {
PaintPad pad = new PaintPad();
pad.setGui();
}
public void setGui() {
JFrame frame = new JFrame();
JPanel drawP = new JPanel();
drawP.addMouseListener(this);
frame.getContentPane().add(BorderLayout.CENTER, drawP);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 500);
frame.setVisible(true);
}
public void paintComponent(Graphics g) {
g.fillOval(mouseX, mouseY, 10, 10);
}
public void mouseClicked(MouseEvent e) {
mouseX = e.getX();
mouseY = e.getY();
repaint();
}
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
}
works but doesnt do anything. how to fix this?
Lensva
Junior Poster in Training
76 posts since Mar 2008
Reputation Points: 4
Solved Threads: 3
You don't need drawP . Add this to the frame, not drawP . Ditto with the MouseListener. Add the Listener to this .
VernonDozier
Posting Expert
5,527 posts since Jan 2008
Reputation Points: 2,633
Solved Threads: 711
Just a couple of minor but important changes in your setGui() method
public void setGui() {
JFrame frame = new JFrame();
// remove this, you want to use your current class instance here
// JPanel drawP = new JPanel();
// again, current instance
addMouseListener(this);
// same here
frame.getContentPane().add(BorderLayout.CENTER, <strong>this</strong>);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 500);
frame.setVisible(true);
}
You were creating a new JPanel object and putting that in your frame and using your existing "pad" object as a mouse listener. Since your class extends JPanel, you really want to use this instead of a new JPanel object.
Edit: heh, same time as Vernon.
Ezzaral
Posting Genius
15,986 posts since May 2007
Reputation Points: 3,250
Solved Threads: 847
reworked my code. it works mostly except for putting an oval at launch by default, which im not sure cant be fixed without a check with my architecture. also if tweaking my first post and actually making a drawP = new JPanel(), how can i achieve the same functionality?
also all but the last oval disapear on resize. is there any way around that without disabling resize and not putting mouseX/mouseY values in an array?
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
public class PaintPad {
private int mouseX, mouseY;
public static void main(String args[]) {
PaintPad pad = new PaintPad();
pad.setGui();
}
public void setGui() {
JFrame frame = new JFrame();
frame.getContentPane().add(BorderLayout.CENTER, new drawPanel());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 500);
frame.setVisible(true);
}
class drawPanel extends JPanel implements MouseListener {
MouseEvent mouseEvent;
public drawPanel() {
new JPanel();
addMouseListener(this);
}
public void paintComponent(Graphics g) {
if(mouseEvent!=null) //draws an oval at launch without this
g.fillOval(mouseX, mouseY, 10, 10);
}
public void mouseClicked(MouseEvent e) {
mouseEvent=e;
mouseX = e.getX();
mouseY = e.getY();
repaint();
}
public void mousePressed(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
}
}
Lensva
Junior Poster in Training
76 posts since Mar 2008
Reputation Points: 4
Solved Threads: 3
reworked my code. it works mostly except for putting an oval at launch by default, which im not sure cant be fixed without a check with my architecture.
You already changed it so it doesn't put the oval on there without a mouse click. If you don't want to have a MouseEvent variable, you can take it out and initialize mouseX and mouseY to be -50 or something so it'll be off the canvas so you won't see it.also if tweaking my first post and actually making a drawP = new JPanel(), how can i achieve the same functionality?
Not sure what you are asking here. You are saying that you no longer want to have a class that extends JPanel?also all but the last oval disapear on resize. is there any way around that without disabling resize and not putting mouseX/mouseY values in an array?
I think there may be a call to JPanel's paintComponent when the resize happens, so that may be why it's clearing. If you put this line at the top of your paintComponent function:
super.paintComponent (g);
the same behavior should occur (only the last oval is visible). I think that is the root cause of why that's occurring (not positive though). As for a solution that doesn't require you to save all the coordinates in an array (or somewhere else), I don't know of any, but that doesn't mean a solution doesn't exist!
VernonDozier
Posting Expert
5,527 posts since Jan 2008
Reputation Points: 2,633
Solved Threads: 711
Not sure what you are asking here. You are saying that you no longer want to have a class that extends JPanel?
what i meant was is it posible to have
public void setGui() {
JFrame frame = new JFrame();
JPanel drawP = new JPanel();
drawP.addMouseListener(this);
frame.getContentPane().add(BorderLayout.CENTER, drawP);
...
do the same as the later version?
i just cant understand why my first code is flawed
Lensva
Junior Poster in Training
76 posts since Mar 2008
Reputation Points: 4
Solved Threads: 3