Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 鼠标包含在对象中_Java_Mouselistener_Jcomponent_Contain - Fatal编程技术网

Java 鼠标包含在对象中

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

我刚开始学习Java,几天来我一直在寻找一种方法来单击绘制的对象,将鼠标包含在一个对象中,例如g.drawRect(x,x,x,x)

我遇到了下面的代码,我正试图让它工作,这样我就可以了解什么是需要包含在一个对象中的鼠标,但我似乎无法使它工作

从“”获取代码

我试着根据他们给出的提示让它工作,但没有希望

感谢您的帮助

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();
        }
    });
}