如何使用鼠标拖动事件在java小程序上绘制矩形并使其保持不变
我有一个可以画矩形的程序。我有两个问题无法解决。在我画出矩形后,它不会停留。我所拥有的唯一一个清除“UnderPaint,repaint”中画布的代码仅在鼠标拖动时调用。为什么当我释放鼠标或移动鼠标时,画布会清晰。第二件事并没有那么大的问题,但我搞不清楚,当我的矩形的高度或宽度为负数时,矩形用黑色填充如何使用鼠标拖动事件在java小程序上绘制矩形并使其保持不变,java,swing,drawing,mouseevent,Java,Swing,Drawing,Mouseevent,我有一个可以画矩形的程序。我有两个问题无法解决。在我画出矩形后,它不会停留。我所拥有的唯一一个清除“UnderPaint,repaint”中画布的代码仅在鼠标拖动时调用。为什么当我释放鼠标或移动鼠标时,画布会清晰。第二件事并没有那么大的问题,但我搞不清楚,当我的矩形的高度或宽度为负数时,矩形用黑色填充 package pracpapp2; import java.awt.*; import java.awt.event.*; import javax.swing.*; public cla
package pracpapp2;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MouseTracker4July extends JFrame
implements MouseListener, MouseMotionListener {
private static final long serialVersionUID = 1L;
private JLabel mousePosition;
int x, y;
int x1, x2, y1, y2;
int w, h;
private JLabel recStart;
private JLabel recStop;
private JLabel cords;
// set up GUI and register mouse event handlers
public MouseTracker4July()
{
super( "Rectangle Drawer" );
mousePosition = new JLabel();
mousePosition.setHorizontalAlignment(SwingConstants.CENTER);
getContentPane().add( mousePosition, BorderLayout.CENTER );
JLabel text1 = new JLabel();
text1.setText( "At the center the mouse pointer's coordinates will be displayed." );
getContentPane().add( text1, BorderLayout.SOUTH );
recStart = new JLabel();
getContentPane().add(recStart, BorderLayout.WEST);
recStop = new JLabel();
getContentPane().add(recStop, BorderLayout.EAST);
cords = new JLabel();
getContentPane().add(cords, BorderLayout.NORTH);
addMouseListener( this ); // listens for own mouse and
addMouseMotionListener( this ); // mouse-motion events
setSize( 800, 600 );
setVisible( true );
}
// MouseListener event handlers
// handle event when mouse released immediately after press
public void mouseClicked( MouseEvent event )
{
mousePosition.setText( "Clicked at [" + event.getX() +
", " + event.getY() + "]" );
}
// handle event when mouse pressed
public void mousePressed( MouseEvent event )
{
mousePosition.setText( "Pressed at [" +(x1 = event.getX()) +
", " + (y1 = event.getY()) + "]" );
recStart.setText( "Start: [" + x1 +
", " + y1 + "]" );
}
// handle event when mouse released after dragging
public void mouseReleased( MouseEvent event )
{
mousePosition.setText( "Released at [" +(x2 = event.getX()) +
", " + (y2 = event.getY()) + "]" );
recStop.setText( "End: [" + x2 +
", " + y2 + "]" );
}
// handle event when mouse enters area
public void mouseEntered( MouseEvent event )
{
mousePosition.setText( "Mouse entered at [" + event.getX() +
", " + event.getY() + "]" );
}
// handle event when mouse exits area
public void mouseExited( MouseEvent event )
{
mousePosition.setText( "Mouse outside window" );
}
// MouseMotionListener event handlers
// handle event when user drags mouse with button pressed
public void mouseDragged( MouseEvent event )
{
mousePosition.setText( "Dragged at [" + (x = event.getX()) +
", " + (y = event.getY()) + "]" );
// call repaint which calls paint
repaint();
}
// handle event when user moves mouse
public void mouseMoved( MouseEvent event )
{
mousePosition.setText( "Moved at [" + event.getX() +
", " + event.getY() + "]" );
}
public void paint(Graphics g)
{
super.paint(g); // clear the frame surface
g.drawString("Start Rec Here", x1, y1);
g.drawString("End Rec Here", x, y);
w = x1 - x;
h = y1 - y;
w = w * -1;
h = h * -1;
g.drawRect(x1, y1, w, h);
cords.setText( "w = " + w + ", h = " + h);
}
public static void main( String args[] )
{
MouseTracker4July application = new MouseTracker4July();
application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
} // end class MouseTracker
您需要将绘制的项目存储在某些数据结构中,并确保在重新绘制时将结构中的每个项目绘制到画布上 此外,您还需要为每个鼠标事件添加重绘 这样:(假设您想要保留所有的rect)-您可以通过删除arraylist并替换为单个rect实例来使用单个rect
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
public class MouseTracker4July extends JFrame implements MouseListener, MouseMotionListener {
private static final long serialVersionUID = 1L;
private final JLabel mousePosition;
int x1, x2, y1, y2;
int w, h;
private final JLabel recStart;
private final JLabel recStop;
private final JLabel cords; // set up GUI and register mouse event handlers
private final ArrayList< Rectangle > rectangles = new ArrayList< Rectangle >();
private boolean isNewRect = true;
public MouseTracker4July() {
super( "Rectangle Drawer" );
this.mousePosition = new JLabel();
this.mousePosition.setHorizontalAlignment( SwingConstants.CENTER );
getContentPane().add( this.mousePosition, BorderLayout.CENTER );
JLabel text1 = new JLabel();
text1.setText( "At the center the mouse pointer's coordinates will be displayed." );
getContentPane().add( text1, BorderLayout.SOUTH );
this.recStart = new JLabel();
getContentPane().add( this.recStart, BorderLayout.WEST );
this.recStop = new JLabel();
getContentPane().add( this.recStop, BorderLayout.EAST );
this.cords = new JLabel();
getContentPane().add( this.cords, BorderLayout.NORTH );
addMouseListener( this ); // listens for own mouse and
addMouseMotionListener( this ); // mouse-motion events
setSize( 800, 600 );
setVisible( true );
}
// MouseListener event handlers // handle event when mouse released immediately after press
public void mouseClicked( final MouseEvent event ) {
this.mousePosition.setText( "Clicked at [" + event.getX() + ", " + event.getY() + "]" );
repaint();
}
// handle event when mouse pressed
public void mousePressed( final MouseEvent event ) {
this.mousePosition.setText( "Pressed at [" + ( this.x1 = event.getX() ) + ", " + ( this.y1 = event.getY() ) + "]" );
this.recStart.setText( "Start: [" + this.x1 + ", " + this.y1 + "]" );
repaint();
}
// handle event when mouse released after dragging
public void mouseReleased( final MouseEvent event ) {
this.mousePosition.setText( "Released at [" + ( this.x2 = event.getX() ) + ", " + ( this.y2 = event.getY() ) + "]" );
this.recStop.setText( "End: [" + this.x2 + ", " + this.y2 + "]" );
Rectangle rectangle = getRectangleFromPoints();
this.rectangles.add( rectangle );
this.w = this.h = this.x1 = this.y1 = this.x2 = this.y2 = 0;
this.isNewRect = true;
repaint();
}
private Rectangle getRectangleFromPoints() {
int width = this.x1 - this.x2;
int height = this.y1 - this.y2;
Rectangle rectangle = new Rectangle( width < 0 ? this.x1
: this.x2, height < 0 ? this.y1
: this.y2, Math.abs( width ), Math.abs( height ) );
return rectangle;
}
// handle event when mouse enters area
public void mouseEntered( final MouseEvent event ) {
this.mousePosition.setText( "Mouse entered at [" + event.getX() + ", " + event.getY() + "]" );
repaint();
}
// handle event when mouse exits area
public void mouseExited( final MouseEvent event ) {
this.mousePosition.setText( "Mouse outside window" );
repaint();
}
// MouseMotionListener event handlers // handle event when user drags mouse with button pressed
public void mouseDragged( final MouseEvent event ) {
this.mousePosition.setText( "Dragged at [" + ( this.x2 = event.getX() ) + ", " + ( this.y2 = event.getY() ) + "]" ); // call repaint which calls paint repaint();
this.isNewRect = false;
repaint();
}
// handle event when user moves mouse
public void mouseMoved( final MouseEvent event ) {
this.mousePosition.setText( "Moved at [" + event.getX() + ", " + event.getY() + "]" );
repaint();
}
@Override
public void paint( final Graphics g ) {
super.paint( g ); // clear the frame surface
g.drawString( "Start Rec Here", this.x1, this.y1 );
g.drawString( "End Rec Here", this.x2, this.y2 );
Rectangle newRectangle = getRectangleFromPoints();
if ( !this.isNewRect ) {
g.drawRect( newRectangle.x, newRectangle.y, newRectangle.width, newRectangle.height );
}
for( Rectangle rectangle : this.rectangles ) {
g.drawRect( rectangle.x, rectangle.y, rectangle.width, rectangle.height );
}
this.cords.setText( "w = " + this.w + ", h = " + this.h );
}
public static void main( final String args[] ) {
MouseTracker4July application = new MouseTracker4July();
application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
} // end class MouseTracker
导入java.awt.BorderLayout;
导入java.awt.Graphics;
导入java.awt.Rectangle;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入java.awt.event.MouseMotionListener;
导入java.util.ArrayList;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.SwingConstants;
公共类MouseTracker4July扩展JFrame实现MouseListener、MouseMotionListener{
私有静态最终长serialVersionUID=1L;
私人最终JLabel鼠标位置;
int-x1,x2,y1,y2;
int w,h;
私人最终JLabel重新启动;
私人最终JLabel recStop;
专用最终JLabel跳线;//设置GUI并注册鼠标事件处理程序
私有最终ArrayList<矩形>矩形=新ArrayList<矩形>();
私有布尔值isNewRect=true;
公共捕鼠器7月4日(){
超级(“矩形抽屉”);
this.mousePosition=new JLabel();
此.mousePosition.setHorizontalAlignment(SwingConstants.CENTER);
getContentPane().add(this.mousePosition,BorderLayout.CENTER);
JLabel text1=新的JLabel();
text1.setText(“将在鼠标指针的中心显示坐标”);
getContentPane().add(text1,BorderLayout.SOUTH);
this.recStart=new JLabel();
getContentPane().add(this.recStart,BorderLayout.WEST);
this.recStop=new JLabel();
getContentPane().add(this.recStop,BorderLayout.EAST);
this.cords=新的JLabel();
getContentPane().add(this.cords,BorderLayout.NORTH);
addMouseListener(此);//侦听自己的鼠标和
addMouseMotionListener(this);//鼠标运动事件
设置大小(800600);
setVisible(真);
}
//MouseListener事件处理程序//在按下鼠标后立即释放鼠标时处理事件
公共无效鼠标点击(最终鼠标事件){
this.mousePosition.setText(“单击[“+event.getX()+”,“+event.getY()+”]);
重新油漆();
}
//按下鼠标时处理事件
公共无效鼠标按下(最终鼠标事件){
this.mousePosition.setText(“在[”+(this.x1=event.getX())+,“+(this.y1=event.getY())+”)处按下”;
this.recStart.setText(“Start:[“+this.x1+”,“+this.y1+”]);
重新油漆();
}
//拖动鼠标后释放鼠标时处理事件
公共无效MouseEvent事件(最终MouseEvent事件){
this.mousePosition.setText(“在[”+(this.x2=event.getX())+“,”+(this.y2=event.getY())+“]时发布”;
this.recStop.setText(“End:[“+this.x2+”,“+this.y2+”]);
矩形矩形=getRectangleFromPoints();
这个.rectangles.add(矩形);
this.w=this.h=this.x1=this.y1=this.x2=this.y2=0;
this.isNewRect=true;
重新油漆();
}
私有矩形getRectangleFromPoints(){
int width=this.x1-this.x2;
内部高度=this.y1-this.y2;
矩形矩形=新矩形(宽度<0?此值为0.x1
:this.x2,高度<0?this.y1
:this.y2,Math.abs(宽度),Math.abs(高度);
返回矩形;
}
//鼠标进入区域时处理事件
公共无效鼠标事件(最终鼠标事件){
this.mousePosition.setText(“鼠标输入于[“+event.getX()+”,“+event.getY()+”]);
重新油漆();
}
//鼠标退出区域时处理事件
公共无效mouseExited(最终MouseEvent事件){
this.mousePosition.setText(“鼠标在窗口外”);
重新油漆();
}
//MouseMotionListener事件处理程序//在用户拖动鼠标并按下按钮时处理事件
公共无效鼠标标记(最终鼠标事件){
this.mousePosition.setText(“在[”+(this.x2=event.getX())+,“+(this.y2=event.getY())+”)处拖动;//调用repaint,调用paint repaint();
this.isNewRect=false;
重新油漆();
}
//当用户移动鼠标时处理事件
public void mouseMoved(最终MouseEvent事件){
this.mousePosition.setText(“在[“+event.getX()+”,“+event.getY()+”])处移动;
重新油漆();
}
@凌驾
公共空间油漆(最终图形g){
super.paint(g);//清除框架表面
g、 抽绳(“此处开始记录”,this.x1,this.y1);
g、 抽绳(“此处末端Rec”,this.x2,this.y2);
矩形newRectangle=getRectangleFromPoints();
如果(!this.isNewRect){
g、 drawRect(newRectangle.x,newRectangle.y,newRectangle.width,newRectangle.height);
}
用于(矩形:this.rectangles){
g、 drawRect(矩形.x,矩形.y,矩形.width,矩形.height);
}
this.cords.setText(“w=“+this.w+”,h=“+this.h”);
}
公共静态void main(最终字符串参数[]){
MouseTracker4July应用程序=新的MouseTracker4July();
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}//结束c
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
public class MouseTracker4July extends JFrame implements MouseListener, MouseMotionListener {
private static final long serialVersionUID = 1L;
private final JLabel mousePosition;
int x1, x2, y1, y2;
int x, y, w, h;
private final JLabel recStart;
private final JLabel recStop;
private final JLabel cords; // set up GUI and register mouse event handlers
boolean isNewRect = true;
public MouseTracker4July() {
super( "Rectangle Drawer" );
this.mousePosition = new JLabel();
this.mousePosition.setHorizontalAlignment( SwingConstants.CENTER );
getContentPane().add( this.mousePosition, BorderLayout.CENTER );
JLabel text1 = new JLabel();
text1.setText( "At the center the mouse pointer's coordinates will be displayed." );
getContentPane().add( text1, BorderLayout.SOUTH );
this.recStart = new JLabel();
getContentPane().add( this.recStart, BorderLayout.WEST );
this.recStop = new JLabel();
getContentPane().add( this.recStop, BorderLayout.EAST );
this.cords = new JLabel();
getContentPane().add( this.cords, BorderLayout.NORTH );
addMouseListener( this ); // listens for own mouse and
addMouseMotionListener( this ); // mouse-motion events
setSize( 800, 600 );
setVisible( true );
}
// MouseListener event handlers // handle event when mouse released immediately after press
public void mouseClicked( final MouseEvent event ) {
this.mousePosition.setText( "Clicked at [" + event.getX() + ", " + event.getY() + "]" );
repaint();
}
// handle event when mouse pressed
public void mousePressed( final MouseEvent event ) {
this.mousePosition.setText( "Pressed at [" + ( this.x1 = event.getX() ) + ", " + ( this.y1 = event.getY() ) + "]" );
this.recStart.setText( "Start: [" + this.x1 + ", " + this.y1 + "]" );
this.isNewRect = true;
repaint();
}
// handle event when mouse released after dragging
public void mouseReleased( final MouseEvent event ) {
this.mousePosition.setText( "Released at [" + ( this.x2 = event.getX() ) + ", " + ( this.y2 = event.getY() ) + "]" );
this.recStop.setText( "End: [" + this.x2 + ", " + this.y2 + "]" );
repaint();
}
// handle event when mouse enters area
public void mouseEntered( final MouseEvent event ) {
this.mousePosition.setText( "Mouse entered at [" + event.getX() + ", " + event.getY() + "]" );
repaint();
}
// handle event when mouse exits area
public void mouseExited( final MouseEvent event ) {
this.mousePosition.setText( "Mouse outside window" );
repaint();
}
// MouseMotionListener event handlers // handle event when user drags mouse with button pressed
public void mouseDragged( final MouseEvent event ) {
this.mousePosition.setText( "Dragged at [" + ( this.x2 = event.getX() ) + ", " + ( this.y2 = event.getY() ) + "]" ); // call repaint which calls paint repaint();
this.isNewRect = false;
repaint();
}
// handle event when user moves mouse
public void mouseMoved( final MouseEvent event ) {
this.mousePosition.setText( "Moved at [" + event.getX() + ", " + event.getY() + "]" );
repaint();
}
@Override
public void paint( final Graphics g ) {
super.paint( g ); // clear the frame surface
g.drawString( "Start Rec Here", this.x1, this.y1 );
g.drawString( "End Rec Here", this.x2, this.y2 );
int width = this.x1 - this.x2;
int height = this.y1 - this.y2;
this.w = Math.abs( width );
this.h = Math.abs( height );
this.x = width < 0 ? this.x1
: this.x2;
this.y = height < 0 ? this.y1
: this.y2;
if ( !this.isNewRect ) {
g.drawRect( this.x, this.y, this.w, this.h );
}
this.cords.setText( "w = " + this.w + ", h = " + this.h );
}
public static void main( final String args[] ) {
MouseTracker4July application = new MouseTracker4July();
application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
} // end class MouseTracker
public void mouseDragged(MouseEvent event) {
// mousePosition.setText("Dragged at [" + (x = event.getX()) + ", "
// + (y = event.getY()) + "]");
// call repaint which calls paint
x = event.getX();
y = event.getY();
compRectPos();
repaint();
}
private void compRectPos()
{
rx = x1;
ry = y1;
w = x - x1;
h = y - y1;
if ( w < 0)
rx += w;
if (h < 0)
ry += h;
w = Math.abs(w);
h = Math.abs(h);
}
public void paint(Graphics g) {
super.paint(g); // clear the frame surface
g.drawString("Start Rec Here", x1, y1);
g.drawString("End Rec Here", x, y);
g.drawRect(rx, ry, w, h);
cords.setText("w = " + w + ", h = " + h);
}