0

以下是我所拥有的,我在一个类中有一个paintComponent方法,

public void paintComponent(Graphics g) {
        g2.setPaint(Color.red);
        g2.fillRect(100, 100, 50, 50);
}

我想让那个图形对象(上)在第二类中跟随我的鼠标,但我不知道如何在我的第二类(下)中调用它,我写了一个第一类的构造函数,但我不知道如何让它出现在我的框架上。PS我在我的框架中添加了mouseMotionListener

public void mouseMoved(MouseEvent e) {
    GOLDraw g1 = new GOLDraw();//default constructor from the first class
    repaint();
}

请简单解释一下如何调用paintComponent方法,以及为什么(我会尝试理解它,我对继承等不太了解)。可能是因为我是初学者而且我做错了,在阅读 api 和 google 几个小时后我什么也没找到。

public class GolPresets extends JComponent implements MouseMotionListener{  


    public GolPresets() {

    }

    @Override
    public void mouseDragged(MouseEvent e) {

    }

    Point point;
    @Override
    public void mouseMoved(MouseEvent e){
       point = e.getPoint();
    }


    public void paintComponent(Graphics g) {
            g.drawRect(point.x, point.y, 100, 100);
    }

    public void GUI() {
        JFrame frame = new JFrame("");
        frame.setVisible(true);
        frame.setSize(500, 500);
        frame.add(new GolPresets());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new GolPresets());
        frame.addMouseMotionListener(this);

    }

    public static void main(String[] args) {
        GolPresets g = new GolPresets();
        g.GUI();
    }

}
4

3 回答 3

1

例如:

Point lastCursorPoint;

public void mouseMoved(MouseEvent e) {
    lastCursorPoint = e.getPoint();
    repaint();
}

public void paintComponent(Graphics g) {
    if (lastCursorPoint != null) {
        g2.setPaint(Color.red);
        g2.fillRect(lastCursorPoint.x, lastCursorPoint.y, 50, 50);
    }
}
于 2015-12-17T21:25:37.583 回答
0

这是一个例子:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class MouseFollower extends JPanel {

   protected Point spot;

   public MouseFollower() {
      final MouseFollower me = this;
      addMouseMotionListener( new MouseMotionAdapter() {
         @Override
         public void mouseMoved( MouseEvent e ) {
            spot = e.getPoint();
            repaint();
         }
      } );

      addMouseListener( new MouseAdapter() {
         @Override
         public void mouseExited( MouseEvent e ) {
            spot = null;
            repaint();
         }
      } );

      setPreferredSize( new Dimension( 300, 300 ) );
   }

   @Override
   public void paintComponent( Graphics g ) {
      super.paintComponent( g );
      if ( spot != null ) {
         Graphics2D g2 = (Graphics2D)g;
         g2.setColor( Color.red );
         g2.fillRect( spot.x, spot.y, 50, 50 );
      }
   }

   public static void main( String[] args ) {
      SwingUtilities.invokeLater( new Runnable() {
         public void run() {
            JFrame win = new JFrame( "MouseFollower" );
            final MouseFollower mf = new MouseFollower();
            win.add( mf );
            win.pack();
            win.addWindowListener( new WindowAdapter() {
               @Override
               public void windowClosing( WindowEvent arg0 ) {
                  System.exit( 0 );
               }
            } );

            win.setVisible( true );
         }
      } );
   }
}
于 2015-12-17T22:23:59.720 回答
0

那么,共享状态在哪里?您需要跟踪方法中的光标位置mouseMoved;您应该只重用已经创建的组件(不是每次都是新组件)并在其repaint()上调用方法。

于 2015-12-17T21:19:45.880 回答