Java 鼠标包含在对象中
我刚开始学习Java,几天来我一直在寻找一种方法来单击绘制的对象,将鼠标包含在一个对象中,例如g.drawRect(x,x,x,x) 我遇到了下面的代码,我正试图让它工作,这样我就可以了解什么是需要包含在一个对象中的鼠标,但我似乎无法使它工作 从“”获取代码 我试着根据他们给出的提示让它工作,但没有希望 感谢您的帮助Java 鼠标包含在对象中,java,mouselistener,jcomponent,contain,Java,Mouselistener,Jcomponent,Contain,我刚开始学习Java,几天来我一直在寻找一种方法来单击绘制的对象,将鼠标包含在一个对象中,例如g.drawRect(x,x,x,x) 我遇到了下面的代码,我正试图让它工作,这样我就可以了解什么是需要包含在一个对象中的鼠标,但我似乎无法使它工作 从“”获取代码 我试着根据他们给出的提示让它工作,但没有希望 感谢您的帮助 import java.awt.*; 导入java.awt.event.MouseEvent; 导入java.awt.event.MouseListener; 导入java.aw
import java.awt.*;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.awt.geom.Ellipse2D;
导入javax.swing.*;
公共类Gui3扩展了JFrame{
JFrame=新JFrame();
MyDrawPanel drawpanel=新建MyDrawPanel();
公共静态void main(字符串[]args){
Gui3 gui=新的Gui3();
gui.go();
}
公开作废go(){
frame.getContentPane().add(drawpanel);
//frame.addMouseListener(本);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架。设置尺寸(300300);
frame.setVisible(true);
}
}
类MyDrawPanel扩展JComponent实现MouseListener{
椭圆E2D椭圆=新的椭圆E2D双(70,70,100,100);
公共组件(图形g){
Graphics2D g2d=(Graphics2D)g;
g2d.圆形(70,70,100,100);
}
@
推翻
公共无效mouseClicked(MouseEvent e){
if((e.getButton()==1)和&oval.contains(e.getX(),e.getY()){
重新油漆();
showMessageDialog(null,e.getX()+“\n”+e.getY());
}
}
@
推翻
公共无效鼠标事件(鼠标事件e){
//TODO自动生成的方法存根
}
@
推翻
公共无效mouseExited(MouseEvent e){
//TODO自动生成的方法存根
}
@
推翻
公共无效鼠标按下(MouseEvent e){
}
@
推翻
公共无效MouseEvent(MouseEvent e){
//TODO自动生成的方法存根
}
公共布尔包含(int x,int y){
返回椭圆。包含(x,y);
}
}
您的注释行提示了您的问题-您从来没有在GUI中实际添加鼠标侦听器,因此没有人收到鼠标事件的通知。看起来您已将面板设置为鼠标侦听器(这很好),所以在MyDrawPanel
类的构造函数中注册它。将此构造函数添加到MyDrawPanel中,您就可以开始了
public MyDrawPanel(){
addMouseListener(this);
}
此外,最好绘制实际的oval
变量,而不是使用drawOval(..)
图形方法,因为您正在内存中创建一个形状和一个彼此不相交的图像。请在paintComponent(Graphics g)
中尝试此操作:
基本上,您需要向
DrawPanel
注册MouseListener
,因为您希望鼠标事件位于DrawPanel
的上下文中,否则MouseEvent
位置信息将不正确
class MyDrawPanel extends JComponent implements MouseListener {
Ellipse2D oval = new Ellipse2D.Double(70, 70, 100, 100);
public MyDrawPanel() {
addMouseListener(this);
}
在进行任何自定义绘制之前,您还需要调用super.paintComponent
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.fillOval(70, 70, 100, 100);
}
您还应该确保您正在事件调度线程的上下文中创建/修改UI。有关更多详细信息,请参阅
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
Gui3 gui = new Gui3();
gui.go();
}
});
}
这将破坏
MouseEvent
上下文,因为事件上下文将是框架,而不是drawPanel
。当我尝试它时,它实际上工作正常,但我会将其移动到drawPanel构造函数。框架有边框,它将按边框宽度(Windows上的2~4像素)将鼠标移出通过框架标题栏(窗口上约25像素),因此如果您尝试单击椭圆的右下角,您将错过它。您可以通过在MyDrawPanel
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
Gui3 gui = new Gui3();
gui.go();
}
});
}