难度实现mousePressed和mouseReleased

时间:2014-08-17 17:21:11

标签: java swing mouselistener

我一直在尝试使用mousePressed和mouseReleased但无济于事。该程序的目的是从鼠标按压获得圆心的初始坐标,并使用鼠标释放来确定该圆的半径。出于某种原因,我无法让球重新绘制,使其中心与mousePressed()的位置相同。我知道Ellipse2D对象的前两个参数决定了椭圆的左上角,所以如果从x坐标中减去半径长度并将半径长度添加到y坐标,那么球不应该出现在第一次鼠标点击?我很难理解为什么它不能构建我想要的地方。

编辑1:重新格式化程序以提高可读性,使程序可编辑。

以下是我的计划的相关部分......

主类

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

 public class Main{
        public static void main(String[] args){
            CircleComponent component = new CircleComponent();
            JFrame frame = new JFrame("Bouncing Ball");

            class mousePressedListener implements MouseListener
            {
            int x1, y1, x2, y2;

            public void mouseClicked(MouseEvent e) { }
            @Override
            public void mouseEntered(MouseEvent e) { }
            @Override
            public void mouseExited(MouseEvent e) { }

            public void mousePressed(MouseEvent e) {
            x1 = e.getX();
            y1 = e.getY();

            System.out.println(x1+ "|x1");
            System.out.println(y1+ "|y1");

            }

        public void mouseReleased(MouseEvent e){   
            x2 = e.getX();
            y2 = e.getY();
            System.out.println(x2 + "|x2");
            System.out.println(y2 + "|y2");
            frame.getHeight();
            frame.getWidth();
            component.moveBall(frame.getHeight(), frame.getWidth(), x1, y1, x2, y2);
        }
        }

        class timeListener implements ActionListener{
        public void actionPerformed(ActionEvent event)
            {
            frame.getHeight();
            frame.getWidth();
            component.moveBall(frame.getWidth(), frame.getHeight());
            }
        }

    frame.add(component); //adds the ball to frame
    frame.setVisible(true);
    frame.setSize(500,500);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //creates square panel with specific size and the default exit

    ActionListener listener = new timeListener();
    Timer timer = new Timer(500, listener);
    timer.start();

    frame.addMouseListener(new mousePressedListener());
   }
   }

CircleComponent类

import javax.swing.JPanel;
import javax.swing.Timer;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import javax.swing.JComponent;
import java.awt.Color;


public class CircleComponent extends JComponent{

    private int x, y, a, b;
    int radius = 50;
    private Color color = Color.WHITE;
    private int dx = 1, dy = 1;//initializes the speed of the ball
    public void paintComponent(Graphics g){
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(color);
        Ellipse2D ball = new Ellipse2D.Double(x, y, 2*radius, 2*radius);
        g2.fill(ball);
    }
    public void moveBall(int inWidth, int inHeight){
        if(x<0 || x>inWidth-65){
        dx = -dx;
        }
        if(y<0 || y>inHeight-150) {
        dy = -dy;
        }
        x = x + dx;
        y = y + dy;
        repaint();
    }
    public void moveBall(int inWidth, int inHeight, int x1, int y1, int x2, int y2){
        double r = (double) (Math.pow((x1-x2),2) + Math.pow((y1-y2),2));
        radius = (int) Math.sqrt(r);
        System.out.println(radius+"|radius");
        if(x<0 || x>inWidth-65){
        dx = -dx;
        }
        if(y<0 || y>inHeight-150) {
        dy = -dy;
        }
        x = x1-radius;
        y = y1+radius;
        x = x + dx;
        y = y + dy;
        System.out.println(x+"X"+y+"Y");
        repaint();
     }
}

1 个答案:

答案 0 :(得分:1)

需要将MouseListener添加到可行的GUI组件中才能使其工作,并且您似乎永远不会将MouseListener添加到任何内容中。您需要在CircleComponent对象上调用.addMouseListener(...)并传入您创建的MouseListener。

另外,格式化的代码很难阅读。请考虑编辑帖子并修复缩进样式,使其统一且一致。我通常避免使用制表符进行缩进(论坛软件通常不能很好地使用制表符)并缩进每个代码块4个空格。


修改
其他建议:

  • 再次,将MouseListener添加到CircleComponent实例,您命名为&#34; component&#34;。
  • 我不会将MouseListener变成一个内部类,而是让它成为独立的类。
  • 您不需要在MouseListener中引用JFrame,只需要CircleComponent实例,您可以通过将引用传递给MouseListener的构造函数,或者通过调用(CircleComponent) e.getSource()来获取
  • 在MouseListener中获取CircleComponent的宽度和高度。
  • 您需要在paintComponent覆盖中调用super方法。
  • 您的计算已关闭,您需要对其进行调试。