[英]Mouse contain within object
我剛開始學習Java,幾天來,我一直在尋找一種單擊繪制對象的方法,以將鼠標包含在諸如g.drawRect(x,x,x,x)之類的對象中...
我遇到了下面的代碼,我試圖使其正常工作,以便我可以了解將鼠標包含在對象中所需的內容,但我似乎無法使其正常工作。
從“ 是否有任何方法可以將MouseListener添加到Graphic對象? ”中獲得代碼。
我試圖根據他們給的提示使它工作,但沒有希望:(。
任何幫助表示贊賞。
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); } }
您的注釋行暗示了您的問題-您實際上從未向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);
}
基本上,您需要向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();
}
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.