कैसे जोड़ने के लिए एक आत्म-परिभाषित MouseMotionListener करने के लिए एक JPanel?

0

सवाल

मैं एक ने लिखा है MouseMotionListener के लिए JPanelहै , लेकिन मैं उलझन में मिल करने के लिए कैसे पर इसे का उपयोग करें.

श्रोता वर्ग काम करता है जब अच्छी तरह से करने के लिए जोड़ा का उपयोग कर फ्रेम aWindow.add(new MouseMotionEvents())है , लेकिन जब मैं इसे जोड़ने की कोशिश करने के लिए पैनल का उपयोग कर content.add(new MouseMotionEvents()), यह काम नहीं करता है । मैं नया हूँ स्विंग करने के लिए और JComponentएस कर सकता है, किसी ने मुझे दे कुछ संकेत?

public class test {

  public static void main(String[] args) {
    JFrame aWindow = new JFrame();
    aWindow.setBounds(600, 600, 600, 600);
    aWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel content = new JPanel();
    content.add(new MouseMotionEvents());
    aWindow.add(content);
    
    aWindow.setVisible(true);
  }
}

class MouseMotionEvents extends JPanel implements MouseListener,
    MouseMotionListener {
  Point p;
  Point r;

  public MouseMotionEvents() {
    addMouseListener(this);
    addMouseMotionListener(this);
  }

  public void mouseClicked(MouseEvent me) {
    // p = me.getPoint();
    // repaint();
  }

  public void mouseEntered(MouseEvent me) {
  }

  public void mouseExited(MouseEvent me) {
  }

  public void mousePressed(MouseEvent me) {
    p = me.getPoint();
    // repaint();
  }

  public void mouseReleased(MouseEvent me) {
    r = me.getPoint();
    repaint();
  }

  public void mouseDragged(MouseEvent me) {
    r = me.getPoint();
    repaint();
  }

  public void mouseMoved(MouseEvent me) {
  }

  public void paint(Graphics g) {
    if (p != null && r != null) {
      Dimension d = getSize();
      int xc = d.width / 2;
      int yc = d.height / 2;
      if(p.getX()-r.getX()>0 && p.getY()-r.getY()>0){
        g.drawRect((int)p.getX(), (int)p.getY(), (int)(p.getX()-r.getX()), (int)(p.getY()-r.getY()));
      }
      if(p.getX()-r.getX()>0 && p.getY()-r.getY()<0){
        g.drawRect((int)p.getX(), (int)p.getY(), (int)(p.getX()-r.getX()), (int)(-p.getY()+r.getY()));
      }
      if(p.getX()-r.getX()<0 && p.getY()-r.getY()>0){
        g.drawRect((int)p.getX(), (int)p.getY(), (int)(-p.getX()+r.getX()), (int)(p.getY()-r.getY()));
      }
      if(p.getX()-r.getX()<0 && p.getY()-r.getY()<0){
        g.drawRect((int)p.getX(), (int)p.getY(), (int)(-p.getX()+r.getX()), (int)(-p.getY()+r.getY()));
      }
      
    }
  }
}
java jframe jpanel mousemotionlistener
2021-11-24 06:06:46
2

सबसे अच्छा जवाब

3

कोड में अपने प्रश्न में, आप जोड़ रहे हैं एक JPanel करने के लिए एक JPanel के बाद से MouseMotionEvents एक JPanel (के बाद से यह फैली वर्ग JPanel). डिफ़ॉल्ट लेआउट प्रबंधक के लिए JPanel है FlowLayout की कोशिश करता है जो प्रदर्शित करने के लिए अपने निहित घटकों पर अपने पसंदीदा आकार. तो जब आप अपने जीयूआई, आप नहीं कर सकते हैं वास्तव में, जहां देखने के MouseMotionEvents प्रकट होता है । आप जोड़ सकते हैं एक सीमा के लिए इसे जोड़ने के द्वारा निम्न (निर्माता के वर्ग MouseMotionEvents)

setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.red));

अब जब आप चलाने के लिए जीयूआई, यह इस तरह दिखता है

original gui

यह है क्योंकि एक JPanel शून्य (पसंदीदा) का आकार क्योंकि इसके आकार के द्वारा निर्धारित किया जाता है घटक है कि यह शामिल है, लेकिन अपने कोड में MouseMotionEvents कोई शामिल हैं घटकों. आप यह तय कर सकते हैं द्वारा स्पष्ट रूप से स्थापना के लिए एक पसंदीदा आकार. यह है कि यह कैसे लग रहा है की स्थापना के बाद एक उपयुक्त पसंदीदा आकार.

preferred size

अब आप कर सकते हैं खींचें माउस के अंदर लाल बॉर्डर और आयतों तैयार हो जाएगा.

इसके अलावा, आप चाहिए ओवरराइड विधि paintComponent और नहीं विधि paint. उल्लेख करने के लिए प्रदर्शन कस्टम चित्रकारी.

यहाँ कोड है.

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MouseMotionEvents extends JPanel implements MouseListener, MouseMotionListener {
    Point p;
    Point r;

    public MouseMotionEvents() {
        addMouseListener(this);
        addMouseMotionListener(this);
        setBorder(BorderFactory.createLineBorder(Color.red));
        setPreferredSize(new Dimension(300, 300));
    }

    public void mouseClicked(MouseEvent me) {
        // p = me.getPoint();
        // repaint();
    }

    public void mouseEntered(MouseEvent me) {
    }

    public void mouseExited(MouseEvent me) {
    }

    public void mousePressed(MouseEvent me) {
        System.out.println("mousePressed");
        p = me.getPoint();
        // repaint();
    }

    public void mouseReleased(MouseEvent me) {
        System.out.println("mouseReleased");
        r = me.getPoint();
        repaint();
    }

    public void mouseDragged(MouseEvent me) {
        r = me.getPoint();
        repaint();
    }

    public void mouseMoved(MouseEvent me) {
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (p != null && r != null) {
            Dimension d = getSize();
            int xc = d.width / 2;
            int yc = d.height / 2;
            if (p.x - r.x > 0 && p.y - r.y > 0) {
                g.drawRect(p.x, p.y, (p.x - r.x), (p.y - r.y));
            }
            if (p.x - r.x > 0 && p.y - r.y < 0) {
                g.drawRect(p.x, p.y, (p.x - r.x), (-p.y + r.y));
            }
            if (p.x - r.x < 0 && p.y - r.y > 0) {
                g.drawRect(p.x, p.y, (-p.x + r.x), (p.y - r.y));
            }
            if (p.x - r.x < 0 && p.y - r.y < 0) {
                g.drawRect(p.x, p.y, (-p.x + r.x), (-p.y + r.y));
            }
        }
    }

    public static void main(String[] args) {
        JFrame aWindow = new JFrame();
        aWindow.setBounds(600, 600, 600, 600);
        aWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel content = new JPanel();
        content.add(new MouseMotionEvents());
        aWindow.add(content);
        
        aWindow.setVisible(true);
    }
}

ध्यान दें कि x और y सार्वजनिक कर रहे हैं के सदस्यों की क्लास Point तो कोई ज़रूरत नहीं है का उपयोग करने के लिए तरीकों getX और getY और इसलिए कोई जरूरत नहीं है के लिए कास्टिंग ।

जब आप जोड़ा गया MouseMotionEvents सीधे करने के लिए JFrame आप जोड़ रहे थे MouseMotionEvents करने के लिए एक JPanel के साथ BorderLayout और आप इसे जोड़ने के लिए केंद्र. के बाद से आप अपने दे दिया JFrame और स्पष्ट आकार, BorderLayout यकीन है कि आकार के MouseMotionEvents लिया के रूप में बहुत संभव के रूप में अंतरिक्ष में JFrame. इसलिए MouseMotionEvents काफी बड़ा था कि तुम सकता है माउस खींचें ।

2021-11-24 11:32:14
0

जोड़ने के लिए एक MouseMotionListener करने के लिए एक JPanel, आप का उपयोग करने के लिए

myPanel.setMouseMotionListener ( myMouseListener );

और कहते है कि सीधे अपने पैनल पर, आप के रूप में किया था mouseMotionEvents वर्ग. Tht क्यों यह काम कर रहा है, जब आप जोड़ने के यह करने के लिए सीधे अपने JFrame.

फिक्सिंग के बाद अपने कोड मैं यह करना चाहिए, जो पूरी तरह से ठीक काम. मैं splitted में यह दो वर्गों, एक मुख्य वर्ग के साथ JFrame और एक के लिए JPanel (सामग्री).

मुख्य वर्ग:

public class MouseMotionListenerTest {
    public static void main ( String[] args ) {
        JFrame aWindow = new JFrame();
        aWindow.setBounds( 600, 600, 600, 600 );
        aWindow.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

        ContentPanel content = new ContentPanel();
        aWindow.add( content );

        aWindow.setVisible( true );
    }
}

पैनल वर्ग:

public class ContentPanel extends JPanel {
    private Point p;
    private Point r;

    public ContentPanel () {
        MouseMotionEvents mme = new MouseMotionEvents();
        addMouseListener( mme );
        addMouseMotionListener( mme );
    }

    public void paint ( Graphics g ) {
        if ( p != null && r != null ) {
            Dimension d = getSize();
            int xc = d.width / 2;
            int yc = d.height / 2;
            if ( p.getX() - r.getX() > 0 && p.getY() - r.getY() > 0 ) {
                g.drawRect( ( int ) p.getX(), ( int ) p.getY(), ( int ) ( p.getX() - r.getX() ), ( int ) ( p.getY() - r.getY() ) );
            }
            if ( p.getX() - r.getX() > 0 && p.getY() - r.getY() < 0 ) {
                g.drawRect( ( int ) p.getX(), ( int ) p.getY(), ( int ) ( p.getX() - r.getX() ), ( int ) ( -p.getY() + r.getY() ) );
            }
            if ( p.getX() - r.getX() < 0 && p.getY() - r.getY() > 0 ) {
                g.drawRect( ( int ) p.getX(), ( int ) p.getY(), ( int ) ( -p.getX() + r.getX() ), ( int ) ( p.getY() - r.getY() ) );
            }
            if ( p.getX() - r.getX() < 0 && p.getY() - r.getY() < 0 ) {
                g.drawRect( ( int ) p.getX(), ( int ) p.getY(), ( int ) ( -p.getX() + r.getX() ), ( int ) ( -p.getY() + r.getY() ) );
            }
        }
    }

    private class MouseMotionEvents extends MouseAdapter {
        public void mouseClicked ( MouseEvent me ) {
            // p = me.getPoint();
            // repaint();
        }

        public void mousePressed ( MouseEvent me ) {
            p = me.getPoint();
            // repaint();
        }

        public void mouseReleased ( MouseEvent me ) {
            r = me.getPoint();
            repaint();
        }

        public void mouseDragged ( MouseEvent me ) {
            r = me.getPoint();
            repaint();
        }
    }
}
2021-11-24 16:35:05

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में