如何定义java组件以使其与mouselistener一起工作
我有一个Ball类,我想扩展JComponent并实现MouseStener如何定义java组件以使其与mouselistener一起工作,java,swing,jcomponent,mouse-listeners,Java,Swing,Jcomponent,Mouse Listeners,我有一个Ball类,我想扩展JComponent并实现MouseStener public class Ball extends JComponent implements MouseListener { Int x, y, radius; public Ball(int X, int Y, int Radius){ //contains only three ints and redefines x,y,radius x=X;
public class Ball extends JComponent implements MouseListener {
Int x, y, radius;
public Ball(int X, int Y, int Radius){
//contains only three ints and redefines x,y,radius
x=X;
y=Y;
radius=Radius;
}
public void draw(Graphics g){
//draw oval using x,y,radius
}
//5 mouselisteners undefined yet
}
所以ball是一个构造器,它由一个框架内的面板使用
对不起,我还没有输入所有代码。我将很快提交我的完整代码
所以我要做的是在ball类中使用MouseEntered listener,这样当鼠标进入组件(ball/Ovalc)时。
但我不知道如何定义该组件,以便它知道已输入该组件。
它需要一些尺寸吗?因为我所做的就是在面板中使用draw函数 你应该打电话
this.addMouseListener(new MouseAdapter() {
....
});
在构造函数中。覆盖适配器内部的mouseEntered()
和mouseExited()
。您应该调用
this.addMouseListener(new MouseAdapter() {
....
});
在构造函数中。覆盖适配器内部的
mouseEntered()
和mouseExited()
。我希望您实现整个MouseListener。您可能希望稍后从球组件中获得更多信息,例如,如果您单击球组件或其他东西,它会移动。如果实现该接口,则适用于以后的更改
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JComponent;
public class Ball extends JComponent implements MouseListener {
int x, y, radius;
public Ball(int x, int y, int radius){
//contains only three ints and redefines x,y,radius
this.x= x;
this.y= y;
this.radius= radius;
}
public void draw(Graphics g){
//draw oval using x,y,radius
}
@Override
public void mouseClicked(MouseEvent arg0) {
}
@Override
public void mouseEntered(MouseEvent arg0) {
//your code to do things, when the mouse entered your ball
}
@Override
public void mouseExited(MouseEvent arg0) {
}
@Override
public void mousePressed(MouseEvent arg0) {
}
@Override
public void mouseReleased(MouseEvent arg0) {
}
}我更希望您实现整个鼠标侦听器。您可能希望稍后从球组件中获得更多信息,例如,如果您单击球组件或其他东西,它会移动。如果实现该接口,则适用于以后的更改
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JComponent;
public class Ball extends JComponent implements MouseListener {
int x, y, radius;
public Ball(int x, int y, int radius){
//contains only three ints and redefines x,y,radius
this.x= x;
this.y= y;
this.radius= radius;
}
public void draw(Graphics g){
//draw oval using x,y,radius
}
@Override
public void mouseClicked(MouseEvent arg0) {
}
@Override
public void mouseEntered(MouseEvent arg0) {
//your code to do things, when the mouse entered your ball
}
@Override
public void mouseExited(MouseEvent arg0) {
}
@Override
public void mousePressed(MouseEvent arg0) {
}
@Override
public void mouseReleased(MouseEvent arg0) {
}
}如果这是我的类,我不会让它扩展JComponent,也不会给它一个MouseListener或MouseMotionListener,特别是如果我想在一个JComponent中显示多个球。相反,我将为它提供公共方法,允许其他类获取其边界(例如,从Shape接口获得的边界),以及是否在Shape中包含某些内容(同样,Shape接口对此工作良好),以及允许外部类更改此对象的状态(外观?)的其他公共方法
然后,我会让一个JComponent持有一个球或一个
ArrayList
,并在该JComponent的MouseListener/MouseMotionListener/MouseAdapter中,遍历ArrayList
,查看鼠标是否位于任何球的内部,如果是,则更改该球的状态。然后在JComponent的paintComponent方法中,我会在包含的每个球上迭代调用draw(g)
。如果这是我的类,我不会让它扩展JComponent,也不会给它一个MouseListener或MouseMotionListener,特别是如果我想在一个JComponent中显示多个球。相反,我将为它提供公共方法,允许其他类获取其边界(例如,从Shape接口获得的边界),以及是否在Shape中包含某些内容(同样,Shape接口对此工作良好),以及允许外部类更改此对象的状态(外观?)的其他公共方法
然后,我会让一个JComponent持有一个球或一个
ArrayList
,并在该JComponent的MouseListener/MouseMotionListener/MouseAdapter中,遍历ArrayList
,查看鼠标是否位于任何球的内部,如果是,则更改该球的状态。然后,在JComponent的paintComponent方法中,我将迭代通过ArrayList
调用draw(g)
。除了满是鳗鱼的气垫船已经说过的话之外,我认为你混淆了作为监听器的概念,并将监听器添加到某些东西中
并不是通过实现MouseListener
来调用这些方法。侦听器是感兴趣的一方,您可以将其添加到感兴趣的对象中。因此,在本例中,您希望将MouseListener
添加到Ball
类中,这与让Ball
类实现MouseListener
完全不同
更多信息可以在中找到,或者在中可以找到一个更简单、更面向Swing的文档。除了满是鳗鱼的气垫船已经说过的话之外,我认为你混淆了作为一个倾听者的概念,并将倾听者添加到一些东西中 并不是通过实现
MouseListener
来调用这些方法。侦听器是感兴趣的一方,您可以将其添加到感兴趣的对象中。因此,在本例中,您希望将MouseListener
添加到Ball
类中,这与让Ball
类实现MouseListener
完全不同
可以在上找到更多信息,也可以在中找到更简单、更面向Swing的文档,我稍微格式化了您的代码,因为您的版本无法编译(“Public”vs“Public”)。构造函数中的变量赋值仍然错误,或者至少没有意义(X=X)。请重新访问您的代码!抱歉,我在手机上输入了代码,它会自动大写。我稍微格式化了你的代码,因为你的版本无法编译(“Public”vs“Public”)。构造函数中的变量赋值仍然错误,或者至少没有意义(X=X)。请重新访问您的代码!对不起,我在手机上输入了密码,它会自动大写。顺便说一下,这还有另一个优点。如果您有“Ball”组件的子类,例如“RotatingBall”。您可以很容易地扩展现有的Ball类并覆盖MouseListenerBy的行为,因为这有另一个优势。如果您有“Ball”组件的子类,例如“RotatingBall”。您可以轻松地扩展现有的Ball类并覆盖MouseListener的行为谢谢您的建议,但我已经能够通过让另一个类通过使用运动侦听器读取坐标来修改球来做到这一点。但是现在我需要将球定义为一个组件,它需要一个mou