Problem with java class Container and Component

E

EVA

This Java code is run ; we can drag a yellow ball with the mouse.
But I would like create many balls on the same Panel of the applet.
How do you process it ?
-------------------------------------------------------
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
//////////////////////////////////////////////////////////////// class
DragDemo
/** This is an application because it has a main method.
It's also an applet because it extends JApplet.
*/

public class DragDemo extends JApplet {
//============================================================= method
main
/* public static void main(String[] args) {
JFrame window = new JFrame();
window.setTitle("Drag Demo");
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setContentPane(new DragBallPanel());
window.pack();
window.show();
}//end main
*/
//====================================================== applet
constructor
public void init() {
DragBallPanel pan1=new DragBallPanel(0,0);
DragBallPanel pan2=new DragBallPanel(50,50);
Container contentPane1= getContentPane();
Container contentPane2= getContentPane();
contentPane1.add(pan1);
contentPane1.add(contentPane2.add(pan2));
}
}//endclass DragDemo

class DragBallPanel extends JPanel implements MouseListener,
MouseMotionListener {
private int _ballX ; // x coord - set from drag
private int _ballY ; // y coord - set from drag
private static final int BALL_DIAMETER = 40; // Diameter of ball
//--- instance variables
/** Ball coords. Changed by mouse listeners. Used by paintComponent.
*/

/** Position in ball of mouse press to make dragging look better. */
private int _dragFromX = 0; // pressed this far inside ball's
private int _dragFromY = 0; // bounding box.

/** true means mouse was pressed in ball and still in panel.*/
private boolean _canDrag = false;

//=============================================================
constructor
/** Constructor sets size, colors, and adds mouse listeners.*/
public DragBallPanel() {
setPreferredSize(new Dimension(300, 300));
setBackground(Color.blue);
}//endconstructor


public DragBallPanel(int ballx,int bally) {
this._ballX=ballx;this._ballY=bally;
setPreferredSize(new Dimension(300, 300));
setBackground(Color.blue);
setForeground(Color.yellow);
//--- Add the mouse listeners.
this.addMouseListener(this);
this.addMouseMotionListener(this);
}//endconstructor

//=================================================== method
paintComponent
/** Ball is drawn at the last recorded mouse listener coordinates. */
public void paintComponent(Graphics g) {
super.paintComponent(g); // Required for background.
g.fillOval(_ballX, _ballY, BALL_DIAMETER, BALL_DIAMETER);
}//end paintComponent

//===================================================== method
mousePressed
/** Set _canDrag if the click is in the ball (or in the bounding
box, which is lazy, but close enuf for this program).
Remember displacement (dragFromX and Y) in the ball
to use as relative point to display while dragging.
*/
public void mousePressed(MouseEvent e) {
int x = e.getX(); // Save the x coord of the click
int y = e.getY(); // Save the y coord of the click

if
(this.inball((double)x,(double)y,(double)_ballX,(double)_ballY,(double)BALL_
DIAMETER)==true) {
_canDrag = true;
_dragFromX = x - _ballX; // how far from left
_dragFromY = y - _ballY; // how far from top
} else {
_canDrag = false;
}
}//end mousePressed

public boolean inball(double x,double y, double coinx,double coiny,double
diam){

if((x-diam/2-coinx)*(x-diam/2-coinx)+(y-diam/2-coiny)*(y-diam/2-coiny)<diam*
diam/4){
return true;
}
return false;
}

//============================================================
mouseDragged
/** Set x,y to mouse position and repaint. */
public void mouseDragged(MouseEvent e) {
if (_canDrag) { // True only if button was pressed inside ball.
//--- Ball pos from mouse and original click displacement
_ballX = e.getX() - _dragFromX;
_ballY = e.getY() - _dragFromY;

//--- Don't move the ball off the screen sides
_ballX = Math.max(_ballX, 0);
_ballX = Math.min(_ballX, getWidth() - BALL_DIAMETER);

//--- Don't move the ball off top or bottom
_ballY = Math.max(_ballY, 0);
_ballY = Math.min(_ballY, getHeight() - BALL_DIAMETER);

this.repaint(); // Repaint because position changed.
}
}//end mouseDragged

//====================================================== method
mouseExited
/** Turn off dragging if mouse exits panel. */
public void mouseExited(MouseEvent e) {
_canDrag = true;
}//end mouseExited

//=============================================== Ignore other mouse
events.
public void mouseMoved (MouseEvent e) {} // ignore these events
public void mouseEntered (MouseEvent e) {} // ignore these events
public void mouseClicked (MouseEvent e) {} // ignore these events
public void mouseReleased(MouseEvent e) {} // ignore these events
}//endclass DragBallPanel
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,770
Messages
2,569,584
Members
45,075
Latest member
MakersCBDBloodSupport

Latest Threads

Top