簡體   English   中英

鼠標包含在對象內

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM