【问题标题】:Draw a filled rectangle with a changeable size绘制一个可变大小的填充矩形
【发布时间】:2015-12-24 11:16:25
【问题描述】:

我正在尝试编写一个代码,在拖动鼠标时绘制一个大小可变的填充矩形。当我运行此代码时,它给了我一个空白窗口。每当我按下并拖动它时它都不会画任何东西。这段代码有什么问题?

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Point;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Rectangle2D;

public class pr2 extends JFrame implements MouseListener, MouseMotionListener 
{
    Container cp;

    Point p1;
    Point p2;

    Rectangle2D rectangle;

    public pr2 (String Name)
    {
        super (Name);
        setLayout(new FlowLayout ());
        setBackground(Color.LIGHT_GRAY);
        setSize(500, 500);
        setVisible(true);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        cp = getContentPane ();

        addMouseListener(this);
     }

    public boolean isPointTwoInQuadOne(Point p1, Point p2) 
    {
       return p1.x >= p2.x && p1.y >= p2.y;
    }

    public boolean isPointTwoInQuadTwo (Point p1, Point p2) 
    {
        return p1.x <= p2.x && p1.y >= p2.y;
    }

    public boolean isPointTwoInQuadThree(Point p1, Point p2) 
    {
        return p1.x <= p2.x && p1.y <= p2.y;
    }

    public boolean isPointTwoInQuadFour (Point p1, Point p2) 
    {
        return p1.x >= p2.x && p1.y <= p2.y;
    }

    public void paintComponent(Graphics g) 
    {
         g.setColor(Color.BLACK);
         super.paintComponents(g);
         Graphics2D g2 = (Graphics2D)g;
         if (rectangle != null) 
         {
             g2.fill(rectangle);
         }
     }

     @Override
     public void mousePressed(MouseEvent e) 
     {
         p1 = e.getPoint();
         rectangle = new Rectangle2D.Double(p1.x, p1.y, p1.x - p1.x, p1.y - p1.y);
     }

    @Override
    public void mouseDragged(MouseEvent e) 
    {
          p2 = e.getPoint();
          if (isPointTwoInQuadOne(p1, p2)) 
          { 
                rectangle.setRect(p2.x, p2.y, p2.x, p1.y);
                repaint();
          } 
          else if (isPointTwoInQuadTwo(p1, p2))
          {
                rectangle.setRect(p1.x, p2.y, p2.x - p1.x, p1.y - p2.y);
                repaint();
          }
          else if (isPointTwoInQuadThree(p1, p2))
          {
                rectangle.setRect(p1.x, p1.y, p2.x - p1.x, p2.y - p1.y);
                repaint();
          }
          else if (isPointTwoInQuadFour(p1, p2))
          {
                rectangle.setRect(p2.x, p1.y, p1.x, p2.y);
                repaint();
          }   
      }

      @Override
      public void mouseClicked(MouseEvent e) { }

      @Override
      public void mouseReleased(MouseEvent e) { }

      @Override
      public void mouseEntered(MouseEvent e) { }

      @Override
      public void mouseExited(MouseEvent e) { }

      @Override
      public void mouseMoved(MouseEvent e) { }
}

【问题讨论】:

标签: java swing graphics mouselistener mousemotionlistener


【解决方案1】:

从显而易见的开始

  • JFrame 没有 paintComponent 方法(您正在调用 super.paintComponents
  • 您正在将MouseListener 直接添加到框架中,如果其上方的子组件也注册了MouseListener,则可能不会通知鼠标事件,此外,您还想添加@987654326 @

建议:

  • 从一个自定义组件开始,从类似JPanel 的东西扩展,覆盖它的paintComponent 方法,确保添加@Override 注释(如果你试图覆盖一个方法,它将引发编译器错误不是由父类实现的)并调用super.paintComponent
  • 向其中添加 MouseListenerMouseMotionListener
  • 将自定义组件的实例添加到JFrame 的实例中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-16
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 2012-11-12
    • 1970-01-01
    • 2023-02-02
    相关资源
    最近更新 更多