[英]Draw a filled rectangle with a changeable size
I am trying to write a code that draws a filled rectangle with a changeable size as the mouse is dragged. 我正在尝试编写一个代码,该代码在拖动鼠标时绘制大小可变的填充矩形。 When I run this code it give me a blank window.
当我运行此代码时,它会给我一个空白窗口。 it doesn't draw anything whenever I press and drag.
每当我按下并拖动时,它都不会绘制任何内容。 What's the problem in this code?
这段代码有什么问题?
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) { }
}
Start with the obvious 从显而易见的开始
JFrame
doesn't have a paintComponent
method (you're calling super.paintComponents
<- Note the 's', which would normally be a bad idea JFrame
没有paintComponent
方法(您正在调用super.paintComponents
<-注意's',这通常是一个坏主意 MouseListener
directly to the frame, which might not be notified of mouse events if a child component above it also has a MouseListener
registered to it, besides, you also want to add a MouseMotionListener
MouseListener
添加到框架中,如果其上方的子组件也已注册有MouseListener
,则可能不会收到鼠标事件的通知,此外,您还想添加MouseMotionListener
Suggestions: 意见建议:
JPanel
, override it's paintComponent
method, make sure you add the @Override
annotation (which will raise a compiler error if you've attempted to override a method which is not implemented by the parent class) and call super.paintComponent
JPanel
扩展,覆盖它的paintComponent
方法,确保添加了@Override
注解(如果您尝试覆盖一个未由父类实现的方法,则会引发编译器错误)并调用super.paintComponent
MouseListener
AND MouseMotionListener
to it. MouseListener
和MouseMotionListener
。 JFrame
JFrame
的实例
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.