我刚开始学习Java,几天后我一直在搜索点击绘制对象的方法,将鼠标包含在g.drawRect(x,x,x,x)等对象中。 ..
我遇到了下面的代码,我试图让它工作,这样我就可以了解在对象中包含鼠标需要什么,但我似乎无法使其工作。
获得来自"的代码Is there any way to add a MouseListener to a Graphic object?"
我已经尝试按照他们给出的提示让它工作但没有希望:(。
感谢任何帮助。
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Ellipse2D;
import javax.swing.*;
public class Gui3 extends JFrame {
JFrame frame = new JFrame();
MyDrawPanel drawpanel = new MyDrawPanel();
public static void main(String[] args) {
Gui3 gui = new Gui3();
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 {
Ellipse2D oval = new Ellipse2D.Double(70, 70, 100, 100);
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.fillOval(70, 70, 100, 100);
}
@
Override
public void mouseClicked(MouseEvent e) {
if ((e.getButton() == 1) && oval.contains(e.getX(), e.getY())) {
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) {
}
@
Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
public boolean contains(int x, int y) {
return oval.contains(x, y);
}
}

答案 0 :(得分:0)
您的注释行暗示您的问题 - 您实际上从未向GUI添加MouseListener,因此没有人收到鼠标事件的通知。看来你已经把你的面板作为鼠标监听器(这很好),所以在MyDrawPanel
类的构造函数中注册它。将此构造函数添加到MyDrawPanel,您应该很高兴。
public MyDrawPanel(){
addMouseListener(this);
}
另外,绘制实际的oval
变量而不是使用Graphics的drawOval(..)
方法可能是一个好主意,因为你在内存中创建了一个形状,并且与一个不相交的图像另一个。请尝试使用此paintComponent(Graphics g)
:
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.fill(oval);
}
答案 1 :(得分:0)
基本上,您需要将MouseListener
注册到DrawPanel
,您希望这样做,因为您希望鼠标事件位于DrawPanel
的上下文中,否则{ {1}}位置信息不正确。
MouseEvent
您还需要在进行任何自定义绘画之前调用class MyDrawPanel extends JComponent implements MouseListener {
Ellipse2D oval = new Ellipse2D.Double(70, 70, 100, 100);
public MyDrawPanel() {
addMouseListener(this);
}
super.paintComponent
您还应该确保在Event Dispatching Thread的上下文中创建/修改UI。有关详细信息,请参阅Initial Threads
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.fillOval(70, 70, 100, 100);
}