当前位置: 首页 > 面试题库 >

有什么方法可以将MouseListener添加到Graphic对象吗?

姚钊
2023-03-14
问题内容

有什么方法可以将MouseListener添加到Graphic对象。
我有一个绘制椭圆的简单GUI。
我想要的是在用户单击椭圆形时处理事件

import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.*;

public class Gui2 extends JFrame {
 JFrame frame = new JFrame();
 MyDrawPanel drawpanel = new MyDrawPanel();

 public static void main(String[] args) {
  Gui2 gui = new Gui2();
  gui.go();
 }

 public void go() {

  frame.getContentPane().add(drawpanel);
  // frame.addMouseListener(this);

  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setSize(300, 300);
  frame.setVisible(true);

 }

}

class MyDrawPanel extends JComponent implements MouseListener {

 public void paintComponent(Graphics g) {

  int red = (int) (Math.random() * 255);
  int green = (int) (Math.random() * 255);
  int blue = (int) (Math.random() * 255);
  Color startrandomColor = new Color(red, green, blue);

  red = (int) (Math.random() * 255);
  green = (int) (Math.random() * 255);
  blue = (int) (Math.random() * 255);
  Color endrandomColor = new Color(red, green, blue);

  Graphics2D g2d = (Graphics2D) g;
  this.addMouseListener(this);
  GradientPaint gradient = new GradientPaint(70, 70, startrandomColor,
    150, 150, endrandomColor);

  g2d.setPaint(gradient);
  g2d.fillOval(70, 70, 100, 100);

 }

 @Override
 public void mouseClicked(MouseEvent e) {
  if ((e.getButton() == 1)
    && (e.getX() >= 70 && e.getX() <= 170 && e.getY() >= 70 && e
      .getY() <= 170)) {
   this.repaint();
   // JOptionPane.showMessageDialog(null,e.getX()+ "\n" + e.getY());
  }

 }

 @Override
 public void mouseEntered(MouseEvent e) {
  // TODO Auto-generated method stub

 }

 @Override
 public void mouseExited(MouseEvent e) {
  // TODO Auto-generated method stub

 }

 @Override
 public void mousePressed(MouseEvent e) {
  // TODO Auto-generated method stub

 }

 @Override
 public void mouseReleased(MouseEvent e) {
  // TODO Auto-generated method stub

 }

}

这是有效的,但当单击位于椭圆周围的虚拟框中时会触发。
当点击完全位于椭圆形上时,有人可以帮助我触发它。
提前致谢。


问题答案:

我想到的最简单的方法是避免fillOval并使用java.awt.geom包中的几何。因此,您可以声明一个椭圆,因为看起来您绘制的椭圆是静态大小的。

 class MyDrawPanel extends JComponent implements MouseListener {
       Ellipse2D oval = new Ellipse2D.Double(70, 70, 100, 100);

       ....

 }

然后在paintComponent中,使用fill(Shape)方法进行绘制。

  public void paintComponent(Graphics g) {
      ....
      Graphics2D g2d = (Graphics2D) g;
      ....
      g2d.fill(oval);

  }

然后在鼠标事件中,您可以检测单击是否在椭圆形中,如下所示:

 public void mouseClicked(MouseEvent e) {
   if ((e.getButton() == 1) && oval.contains(e.getX(), e.getY()) ) {
      repaint();
    // JOptionPane.showMessageDialog(null,e.getX()+ "\n" + e.getY());
   }
 }


 类似资料:
  • 问题内容: 看来,当我在对象中使用数字类型作为键名时,它总是会转换为字符串。无论如何,实际上是否可以将其存储为数字?正常的类型转换似乎不起作用。 例: 目录输出: 我 想要的 是: 忠告? 问题答案: 不,这是不可能的。 密钥将始终转换为字符串。 属性名称必须是字符串。这意味着非字符串对象不能用作对象中的键。任何非字符串对象(包括数字)都可以通过toString方法转换为字符串。

  • 如果我创建一个继承JComponent的新类,我重写了JComponent的绘图Component(Graphics g)方法,通过使用g绘制一个圆圈,我应该修改什么才能使MouseListener仅在我单击组件的边界内时触发? 因为我在组件的构造函数中添加了setBounds(…)然后添加了一个MouseListener,但它会在我每次单击自定义组件所在容器中的任何位置时触发,而不仅仅是在我单击

  • 我想编写一个名为addNewPhone(Phone newPhone)的方法,将一个Phone添加到一个电话数组列表中; 电话类别: 车间类别: 主要类: 我知道我需要返回ArrayList,并且我需要在这个方法中接收Phone type对象,然后它应该返回ArrayList和一个新的phones,但我不知道为什么它不起作用。 Eclipse显示我符合的方法:“newPhone无法解析或未归档”。

  • 为所有的代码道歉。我尽量少发帖。

  • 问题内容: 我对Swift(和iOS编程)完全陌生,但是我开始把它弄乱了(当所有东西仍然是beta版本:D时,这不是一个好主意)。所以我试图自己弄清楚,但还是没有。甚至尝试添加包含选择器的子视图都没有成功。那有人可以帮我吗? 问题答案: 好吧,这是我的最终代码。这是一些想法的混合。我接受答案的主要原因是我的代码在Swift中,我的代码使用UIAlertController,我的代码用于选择器。我要