วิธีการเพิ่มตัวเองกำหนดไว้ 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 ดูเหมือนเป็นอย่างนั้น คุณสามารถเพิ่มชายแดนไปมันโดยการเพิ่มต่อไปนี้(ใน constructor ของชั้นเรียน MouseMotionEvents)

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

ตอนนี้ตอนที่นายวิ่งตรงไปที่ส่วนติดต่อผู้ใช้แบบนั้นมันดูเหมือนนี้

original gui

นี่คือเพราะ JPanel มีเลขศูนย์(แนะนำ)ขนาดเพราะมันขนาดของตัดสินใจโดยส่วนประกอบนั่นมันมีแต่ในรหัสของคุณ MouseMotionEvents ไม่มีส่วนประกอบ คุณสามารถแก้ไขเรื่องนี้โดยในข้อบังคับการตั้งค่าที่ต้องการใช้ขนาดด้วย นี่คือว่ามันดูเป็นยังไงหลังจากการตั้งค่าที่เหมาะสมที่ควรใช้ขนาดด้วย

preferred size

ตอนนี้คุณสามารถลากเมาส์ภายในสีแดงชายแดนและ rectangles จะถูกวาดไว้.

แล้วก็คุณควรจะยกเลิกวิธีการ 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 และ explicit ขนาดที่ 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ý
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่