Win a copy of Kotlin in Action this week in the Kotlin forum!
  • Post Reply Bookmark Topic Watch Topic
  • New Topic

Self controlling component  RSS feed

 
con nor
Greenhorn
Posts: 2
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hi there

I'm making a painfully slow adjustment from flash programming to java.
I am currently trying to generate a scatterplot where the points draw themselves and detect if the mouse is over them.

I have created a scatterplot class, a pointsArrayList class and a custom Point object(code below). I've currently got the points to draw themselves but cannot get the mouseEvent to work. I've extended the point class from the component class so I though mouseActions would be inherited.
Have I got this all wrong?



//Point.java
package connor;
import java.awt.*;
import java.awt.event.*;

public class Point extends Component implements MouseListener{
private int _x;
private int _y;

/** Creates a new instance of Point */
public Point(int x,int y) {
_x=x;
_y=y;
addMouseListener(this);
}

public int getX() {
return _x;
}

public int getY() {
return _y;
}

public void paint(Graphics g){
g.fillOval(getX(),getY(),10,10);
}

public void mouseClicked(MouseEvent e) {
System.out.println("hit");
}

public void mouseEntered(MouseEvent e) {
System.out.println("hit");
}

public void mouseExited(MouseEvent e) {
}

public void mousePressed(MouseEvent e) {
}

public void mouseReleased(MouseEvent e) {
}
}
 
Stefan Wagner
Ranch Hand
Posts: 1923
Linux Postgres Database Scala
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Whaaaaaaa!
Did you calculate, how many MouseListeners you get, for a 1024x768 pixel area?
768.432

The pixels are drawn on a Component. Give the Component the MouseListener.

There is a AWT/Swing-Forum waiting for this question to be moved to.
(Wait for the sheriffs, their job is moving.)
 
Dirk Schreckmann
Sheriff
Posts: 7023
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Moving this to the Swing / JFC / AWT forum...
 
Eddie Vanda
Ranch Hand
Posts: 283
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Hi Con,

If you can see the circles drawn by the paint routine then I guess your point must have a size big enough to accept a mouse listener. Maybe you could also implement MouseMotionListener and see if that can detect your mouse.

I would not have chosen Point as the class name since there is already a Point class in java.awt.* which you import. Better ranchers than me can say whether that is a problem or not.

I guess individual mouse listener points are ok if you only have a couple of hundred or so. That would certainly simplify your mouse event point identification. I have had up to 500 small JLabel widgets each with a mouse listener with no discernable slowdown effect.

Tell us how you go.

Ed
 
con nor
Greenhorn
Posts: 2
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I've tried the motionListener and still no joy.
I did try a different method where I declared a private Reactangle object within the point. This allowed me to trigger a mousePoint by passing it the mouseCo-ords from the applet (code below). This gave me the result I wanted but not in the way I wanted.

I think what I'm trying to do is create a JComponent from scratch?
The bigger picture is to create interective graphs and to do this the final elements will need to have some degree of self-knowledge. I want them to draw themselves and detect mouse actions relating to themselves.
I then need to extend them into having different shapes & colours. (which is why I didn't want to rely on the Rectangle object). I can't seem to find much information on this anywhere? Any Ideas?

//RectPoint.java
//A rectangular data node object
package connor;
import java.awt.*;

//public class RectPoint extends Rectangle{
public class RectPoint{
private int _x,_y;
private String _n;
private boolean inside=false;
private Rectangle box;
Graphics g;

// Creates a new instance of RectPoint
public RectPoint(String name, int x, int y, int width, int height) {
_x=x;
_y=y;
_n=name;
box=new Rectangle(x,y,width,height);
}

//if mouse is moved inside our rectangle, the flag "inside" is set
public void SubmitMouseCoord(int x, int y)
{
//System.out.println("here");
if(this.box.contains(x,y))
inside=true;
else
inside=false;
}

public String getN(){
return _n;
}

public void paint(Graphics g){
g.fillRect(box.x, box.y, box.width, box.height);
if(inside==true){
g.drawString(this.getN(), this._x+20, this._y+10);
}
}
}
 
Jose Botella
Ranch Hand
Posts: 2120
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Welcome to the Ranch con!

Performing Custom Painting from the Java Tutorial will provide you useful compulsary information.
I will quote:

Before you implement a component that performs custom painting, first make sure that you really need to do so. You might be able to use the text and image capabilities of labels, buttons
 
Don't get me started about those stupid light bulbs.
  • Post Reply Bookmark Topic Watch Topic
  • New Topic
Boost this thread!