Ako pridať vlastné definované MouseMotionListener na JPanel?

0

Otázka

Napísal som MouseMotionListener pre JPanel,, ale ja sa zmiasť, ako ju používať.

Poslucháč triedy funguje dobre, keď pridané na rám pomocou aWindow.add(new MouseMotionEvents())ale keď sa snažím ju pridať na panel pomocou content.add(new MouseMotionEvents()),, nefunguje to. Som nový Swing a JComponents, mohol by niekto mi dať nejaké rady?

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

Najlepšiu odpoveď

3

Kód na vašu otázku, pridávate JPanel na JPanel od MouseMotionEvents je JPanel (od rozširuje triedy JPanel). Štandardný layout manager pre JPanel je FlowLayout ktorý sa snaží zobrazovať jeho obsiahnuté komponenty na svoje preferované veľkosti. Takže keď ste spustiť GUI, nemôžete naozaj vidieť, kde MouseMotionEvents zobrazí sa ikona. Môžete pridať orámovanie na to pridaním takto (v konštruktora triedy MouseMotionEvents)

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

Teraz, keď spustíte GUI, vyzerá to, že tento

original gui

Je to preto, lebo JPanel má nulový (preferované) veľkosť, pretože jeho veľkosť je určená komponenty, ktoré obsahuje, ale vo vašom kód MouseMotionEvents neobsahuje žiadne komponenty. Môžete to napraviť tým, explicitne nastaviť preferované veľkosti. To je, ako to vyzerá po nastavení vhodnej preferované veľkosti.

preferred size

Teraz môžete ťahaním myši vo vnútri červeného hranice a obdĺžniky sa budú čerpať.

Tiež, mali by ste potlačiť metóda paintComponent a nie spôsob paint. Odkazujú na Vykonanie Vlastné Maľby.

Tu je kód.

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);
    }
}

Upozorňujeme, že x a y sú verejné členov triedy Point takže nie je potrebné používať metódy getX a getY a preto nie je potrebné na zalievanie.

Pri pridaní MouseMotionEvents priamo na JFrame boli ste pridaní MouseMotionEvents na JPanel s BorderLayout a boli ste pridaní do CENTRA. Keďže ste dali svoj JFrame a explicitné veľkosť, BorderLayout uistiť sa, že veľkosť MouseMotionEvents vzal toľko priestoru, ako je to možné v JFrame. Teda MouseMotionEvents bol dosť veľký, že by ste mohli ťahaním myši vo vnútri.

2021-11-24 11:32:14
0

Ak chcete pridať MouseMotionListener na JPanel, budete musieť použiť

myPanel.setMouseMotionListener ( myMouseListener );

a zavolať priamo na váš panel, ako ste to robili v mouseMotionEvents triedy. Tht je dôvod, prečo je práca, keď ste pridať túto priamo do vašej JFrame.

Po stanovení váš kód som dostal to, čo by malo fungovať úplne v poriadku. Som splitted to v dvoch tried, jedna hlavná trieda s JFrame a jeden pre JPanel (obsah).

Hlavné triedy:

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 );
    }
}

Panel class:

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

V iných jazykoch

Táto stránka je v iných jazykoch

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