2015-10-04 65 views
1

可见JComponents我试图代码,主要是用于以示范一个简单的Java应用程序,但它不会出于某种原因。它的主要功能是基本跟踪鼠标的移动,并在鼠标所在的位置绘制一个框。我一直在研究一些代码,这就是我所拥有的。难道我做错了什么?图纸上的MouseEvent

这是主类

package peter; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.MouseInfo; 
import java.awt.Rectangle; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionListener; 

import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Frame extends JPanel implements MouseMotionListener { 

    private final static JFrame window = new JFrame(); 

    public Frame(){ 
     addMouseMotionListener(this); 
     setPreferredSize(new Dimension(450, 450)); 
     setBackground(Color.GREEN); 
    } 

    private static int mouseX; 
    private static int mouseY; 
    public static void main(String[] args){ 
     //Create and set up the window. 
     JFrame frame = new JFrame("MouseMotionEventDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //Create and set up the content pane. 
     JComponent newContentPane = new Frame(); 
     newContentPane.setOpaque(true); //content panes must be opaque 
     frame.setContentPane(newContentPane); 

     //Display the window. 
     frame.pack(); 
     frame.setVisible(true); 
    } 
    @Override 
    public void mouseDragged(MouseEvent e) 
    { 
     ; 
    } 
    @Override 
    public void mouseMoved(MouseEvent e) 
    { 
     JComponent P = new Paintings(); 
     window.add(P); 
     System.out.println("Mouse moved"); 
    } 

    public static int getMouseY() 
    { 
     return MouseInfo.getPointerInfo().getLocation().y; 
    } 
    public static int getMouseX() 
    { 
     return MouseInfo.getPointerInfo().getLocation().x; 
    } 

    public static Rectangle rectOnMouse() 
    { 
     Rectangle rect = new Rectangle(getMouseX(), getMouseY(), 10,10);  
     return rect; 
    } 
} 

这是绘画类

package peter; 

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import javax.swing.JComponent; 

public class Paintings extends JComponent{ 

    public void paintComponent(Graphics g) 
    { 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.draw(Frame.rectOnMouse()); 
    } 
} 
+0

你的 'getMouseX()' 将返回 'Y'。 – leeor

+0

我更新了代码以解决此问题。感谢您的输入 –

+0

在您做出大量不正确的假设时阅读教程。对于你重复创作和添加绘画对象是错误的。为什么要重复组件? –

回答

4

你不想让你的MouseMotionListener中添加组件。只需改变一个矩形的位置并绘制它。此外,您想要将MouseListener或MouseMotionListener添加到绘图组件,否则您的鼠标点可能会关闭。例如:

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class SimpleDraw extends JPanel { 
    private static final int PREF_W = 450; 
    private static final int PREF_H = PREF_W; 
    private static final Dimension RECT_DIM = new Dimension(10, 10); 
    private Rectangle rect = null; 

    public SimpleDraw() { 
     addMouseMotionListener(new MyMouse()); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     if (rect != null) { 
      g2.draw(rect); 
     } 
    } 

    // so this JPanel's is sized correctly 
    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private class MyMouse extends MouseAdapter { 

     @Override 
     public void mouseMoved(MouseEvent e) { 
      // simply change the Rectangle 
      rect = new Rectangle(e.getPoint(), RECT_DIM); 
      repaint(); // and have the JVM re-paint this JPanel 
     } 
    } 

    private static void createAndShowGui() { 
     SimpleDraw mainPanel = new SimpleDraw(); 

     JFrame frame = new JFrame("SimpleDraw"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     // initialize our GUI on the Swing event thread 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(); 
      } 
     }); 
    } 
} 

更多关于摆动拉丝:

与您的代码的其他问题高级教程:

  • 你会想避免让你的视图类,例如框架,实现你的监听器接口,因为它可能会变得混乱,并且不能很好地扩展。
  • 你过分依赖静态方法太多了,做这个松散的OOP的优势,主要是面向对象的,以帮助减少复杂问题的能力。
  • 同样你的mouseMoved方法创建新的绘画作品组成部分,不断增加他们到JFrame。这不仅是不必要的,它是有害的,因为新组件将成为资源和内存占用,并且将覆盖JFrame contentPane中的任何内容,包括具有MouseMotionListener的Frame实例。您想要将一个组件作为绘图组件添加到顶层窗口中,并只添加一次,在我的代码中,这是我的SimpleDraw类的一个实例。 mouseMoved方法应该用于移动一个逻辑实体,在我的代码中称为rect,然后调用repaint()
+0

感谢所有这些信息!对此,我真的非常感激! –

0

我的猜测是,你还需要调用任何组件上重绘()方法你每次更新后都会重新绘制。另外,您只需添加一次绘画方法。你想要做的只是从鼠标监听器调用它。 在主函数中创建P并将其添加到窗口中。
致电P.repaint();来自鼠标听众。 阅读关于paintComponent()和MouseListeners的oracle文档。

+0

我试过了,它没有工作,任何其他的建议? –

+0

这个回答过度简化了你的问题,并没有解决你的错误的MouseMotionListener。 –