【问题标题】:How to make a paintComponent follow your mouse?如何让paintComponent跟随你的鼠标?
【发布时间】:2015-12-17 21:15:59
【问题描述】:

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

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

我想让那个图形对象(上图)在第二类中跟随我的鼠标,但我不知道如何在我的第二类(下)中调用它,我写了一个第一类的构造函数,但我不知道不知道如何让它出现在我的框架上。附言 我将 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();
    }

}

【问题讨论】:

  • 调用repaint 将在事件调度线程上安排一个“绘制”事件,该线程将通过一系列额外的方法调用调用您的paintComponent 方法。请参阅Painting in AWT and SwingPerforming Custom Painting 了解有关绘画工作原理的更多详细信息
  • 这里是如何使组件可拖动:sourceforge.net/p/tus/code/HEAD/tree/tjacobs/ui/drag/…
  • 到目前为止,您已经提供了一堆脱离上下文的代码,它们没有提供任何关于您正在做什么或如何产生问题的线索。考虑提供一个runnable example 来证明您的问题。这不是代码转储,而是您正在做的事情的一个例子,它突出了您遇到的问题。这将减少混乱并获得更好的响应

标签: java graphics2d mousemotionlistener


【解决方案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);
    }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 对不起,我不明白您所说的共享状态是什么意思。我知道我需要跟踪鼠标位置并绘制鼠标所在的位置,但我不知道如何调用paintComponent 方法,这就是问题所在。
    • 一般来说,共享状态是在两个或多个组件(通常是 Java 中的类)之间共享的可变状态(字段、变量、对象等)。就您而言,您的共享状态是什么?鼠标的位置。鉴于方法 paintComponent 的签名已被 Swing 固定和禁止,您将无法将其作为参数传递。访问该信息的其他方法是通过其他类中的公共静态字段(大禁忌),或者从正在绘制的组件中的一个或多个字段。
    • 我使用了一个 Point 变量,在编辑后,在我的paintComponent 中我做了 g2.fillRect(point.x, point.y, 50, 50);,但它仍然对某些人不起作用原因。
    • 好吧,用你的代码更新你的帖子,让我们看看。
    • 另外,您的paintComponent 方法应该调用super.paintComponent(g) 作为它的第一条语句。
    【解决方案3】:

    这是一个例子:

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

    【讨论】:

      猜你喜欢
      • 2011-11-08
      • 1970-01-01
      • 2010-11-25
      • 2018-11-04
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 2023-03-05
      相关资源
      最近更新 更多