Reputation: 11755
I can already create a ball in a panel on MousePressed and MouseReleased and update coordinates with MotionListener and change the color of the ball when the mouse is over it. This works fine in the myPanel class because the panel has defined dimensions and the mouse works inside it. But what I have to do now and am not sure how is to make the Ball class extend Component and implement MouseListener. And with that I have to use MouseEntered in the Ball class to change the color of the ball. Help?
//Ball
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Ball extends JComponent implements MouseListener{
public int x,y,r;
public Color c = Color.BLUE;
private int distance = 0;
public Ball(int X, int Y, int R){
super();
x=X;
y=Y;
r=R;
addMouseListener(this);
}
public void draw(Graphics g){
g.setColor(c);
g.fillOval(x-r, y-r, 2*r, 2*r);
}
public void mousePressed(MouseEvent me){}
public void mouseReleased(MouseEvent me){ }
public void mouseClicked(MouseEvent me){}
public void mouseEntered(MouseEvent me){
c = Color.ORANGE;
}
public void mouseExited(MouseEvent me){}
}
//myPanel
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.MouseInputAdapter;
public class myPanel extends JPanel implements MouseListener{
private Color c = new Color(150,200,100);
public Ball ball = new Ball(100,100,50);
private Point mouseCoords = new Point();
public myPanel(){
super();
setLayout(new FlowLayout());
addMouseListener(this);
add(ball);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
ball.draw(g);
}
public void mousePressed(MouseEvent me){
ball.x = me.getX();
ball.y = me.getY();
labelPanel.setX(me.getX()); //Report x and y values
labelPanel.setY(me.getY());
// ball.c = Color.RED; //change color on click
repaint();
}
public void mouseReleased(MouseEvent me){}
public void mouseMoved(MouseEvent me) {}
public void mouseClicked(MouseEvent me){}
public void mouseEntered(MouseEvent me){}
public void mouseExited(MouseEvent me){}
}
// myFrame
import java.awt.*;
import javax.swing.*;
public class myFrame extends JFrame{
public myPanel left = new myPanel();
public labelPanel right = new labelPanel();
public myFrame(){
super("This is my Frame");
setLayout(new BorderLayout());
setSize(900,700);
add(left,BorderLayout.CENTER);
add(right,BorderLayout.EAST);
setVisible(true);
}
public static void main(String[] args){
myFrame mF = new myFrame();
mF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
//labelPanel
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.MouseInputAdapter;
public class labelPanel extends JPanel{
public static JLabel xCoord = new JLabel("X=",JLabel.RIGHT);
public static JLabel yCoord = new JLabel("Y=",JLabel.RIGHT);
public Color c = new Color(100,200,10);
public labelPanel() {
super();
setBackground(c);
setLayout(new GridLayout(2,1));
add(xCoord);
add(yCoord);
}
public static void setX(int x){
xCoord.setText("X=" + x);
}
public static void setY(int y){
yCoord.setText("Y=" + y);
}
}
So if you run the code, it works as previously mentioned, but I don't know how to define the Ball class as a Component/JComponent so that it would implement MouseEntered
Upvotes: 4
Views: 8043
Reputation: 5452
Use addMouseListener(this)
in your constructor:
public Ball(int X, int Y, int R){
super();
x=X;
y=Y;
r=R;
addMouseListener(this);
}
And remove it from your draw()
method.
Also, if you might want to consider overriding paint(Graphics g)
. This will allow Swing to determine when to draw. You can always manually choose when to draw by calling repaint();
or calling paint()
. repaint()
paints this component and all subcomponents, and also clears the component. paint()
just paints this component, not subcomponents, and does not clear the screen unless included in the paint
method.
Tell me if that doesn't fix it.
Upvotes: 4