Java 鼠标侦听器没有给出正确的点

Java 鼠标侦听器没有给出正确的点,java,swing,user-interface,listener,shapes,Java,Swing,User Interface,Listener,Shapes,我正在制作一个基于用户输入绘制不同形状的程序。按住并拖动光标时,将绘制形状。但由于某些原因,每当按下光标时,形状都会从光标下方约25像素处开始。有人知道为什么以及如何修复它吗 我的代码 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.geom.*; public class DrawShapes extends JFrame { private JLabel displ

我正在制作一个基于用户输入绘制不同形状的程序。按住并拖动光标时,将绘制形状。但由于某些原因,每当按下光标时,形状都会从光标下方约25像素处开始。有人知道为什么以及如何修复它吗

我的代码

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.geom.*;


public class DrawShapes extends JFrame
{
    private JLabel display;
    private Point point1, point2;
    private ShapeDrawer drawer;

public DrawShapes()
{
    Container contain = getContentPane();

    point1 = null;
    point2 = null;

    //Setup JLabel and add it to container
    display = new JLabel("Line");
    contain.add(display, BorderLayout.SOUTH);

    //Setup JPanel and add it to top of container
    drawer = new ShapeDrawer();
    drawer.setPreferredSize(new Dimension(500,500));
    contain.add(drawer, BorderLayout.NORTH);

    //Setup listeners
    ShapeListener  listener = new ShapeListener();
    addKeyListener(listener);
    addMouseListener(listener);
    addMouseMotionListener(listener);

    setTitle("Press l for line, o for oval, r for rectangle");
    pack();
    setVisible(true);
}

//Class for drawing shapes
private class ShapeDrawer extends JPanel
{
    public void paintComponent(Graphics paint)
    {
        super.paintComponent(paint);

        Graphics2D g2 = (Graphics2D) paint;
        setBackground(Color.white);
        g2.setColor(Color.black);

        //Draw different shapes based on user input
        if(point1 != null && point2 != null)
        {
            if(display.getText().equals("Circle"))
            {
                g2.fillOval(point1.x - 6, point1.y - 6,
                        6* 2, 6 * 2);
            }
            else if(display.getText().equals("Oval"))
            {
                g2.drawOval(point1.x,point1.y,point2.x,point2.y);
            }
            else if(display.getText().equals("Line"))
            {
                g2.drawLine(point1.x, point1.y, point2.x, point2.y);
            }
            else if(display.getText().equals("Rectangle"))
            {
                g2.drawRect(point1.x, point1.y, point2.x, point2.y);
            }
        }
    }
}

private class ShapeListener implements MouseListener, MouseMotionListener ,KeyListener
{
    //Change the label if something else is pressed
    public void keyPressed(KeyEvent event)
    {
        if(event.getKeyText(event.getKeyCode()).equals("C"))
            display.setText("Circle");
        else if(event.getKeyText(event.getKeyCode()).equals("O"))
            display.setText("Oval");
        else if(event.getKeyText(event.getKeyCode()).equals("R"))
            display.setText("Rectangle");
        else if(event.getKeyText(event.getKeyCode()).equals("L"))
            display.setText("Line");
    }       

    public void keyReleased(KeyEvent event){};
    public void keyTyped(KeyEvent event){};

    //Get first point where mouse is pressed
    public void mousePressed(MouseEvent event)
    {
        point1 = event.getPoint();

    }

    //Get the point while mouse is being pressed
    public void mouseDragged(MouseEvent event) 
    {
        point2 = event.getPoint();
        drawer.repaint();

    }

    public void mouseReleased(MouseEvent event) {}
    public void mouseEntered(MouseEvent event) {}
    public void mouseExited(MouseEvent event) {}
    public void mouseClicked(MouseEvent event) {}
    public void mouseMoved(MouseEvent event) {}



}
}
主要方法是什么

import javax.swing.JFrame;
class ShapesViewer
{
public static void main(String[] args)
{
    DrawShapes shapes = new DrawShapes();

    shapes.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

您需要将鼠标侦听器添加到图形JPanel中,而不是添加到JFrame中

更改此项:

ShapeListener  listener = new ShapeListener();
addMouseListener(listener);
addMouseMotionListener(listener);
为此:

drawer.ShapeListener  listener = new ShapeListener();
drawer.addMouseListener(listener);
drawer.addMouseMotionListener(listener);

由于菜单栏的原因,JFrame中点的位置在JPanel上方25点。

您需要将鼠标光标添加到图形JPanel,而不是JFrame

更改此项:

ShapeListener  listener = new ShapeListener();
addMouseListener(listener);
addMouseMotionListener(listener);
为此:

drawer.ShapeListener  listener = new ShapeListener();
drawer.addMouseListener(listener);
drawer.addMouseMotionListener(listener);

由于菜单栏的原因,JFrame中点的位置在JPanel上方25点。

您需要将鼠标光标添加到图形JPanel,而不是JFrame

更改此项:

ShapeListener  listener = new ShapeListener();
addMouseListener(listener);
addMouseMotionListener(listener);
为此:

drawer.ShapeListener  listener = new ShapeListener();
drawer.addMouseListener(listener);
drawer.addMouseMotionListener(listener);

由于菜单栏的原因,JFrame中点的位置在JPanel上方25点。

您需要将鼠标光标添加到图形JPanel,而不是JFrame

更改此项:

ShapeListener  listener = new ShapeListener();
addMouseListener(listener);
addMouseMotionListener(listener);
为此:

drawer.ShapeListener  listener = new ShapeListener();
drawer.addMouseListener(listener);
drawer.addMouseMotionListener(listener);

由于菜单栏的原因,JFrame中的点的位置比JPanel高25点。

不要将侦听器添加到框架中,直接将它们添加到
ShapeDrawer
MouseEvent
与生成事件的组件的源相关

帧的左上角将为
0x0
,但由于帧的边框,帧内容将在帧内偏移若干像素

例如


考虑使用
keylister的

不要将侦听器添加到帧中,直接将它们添加到
形状的awer
MouseEvent
与生成事件的组件的源相关

帧的左上角将为
0x0
,但由于帧的边框,帧内容将在帧内偏移若干像素

例如


考虑使用
keylister的

不要将侦听器添加到帧中,直接将它们添加到
形状的awer
MouseEvent
与生成事件的组件的源相关

帧的左上角将为
0x0
,但由于帧的边框,帧内容将在帧内偏移若干像素

例如


考虑使用
keylister的

不要将侦听器添加到帧中,直接将它们添加到
形状的awer
MouseEvent
与生成事件的组件的源相关

帧的左上角将为
0x0
,但由于帧的边框,帧内容将在帧内偏移若干像素

例如

考虑使用
keylister