Java (drawRect)为什么在我单击“撤消”按钮后原点总是有一个点?

Java (drawRect)为什么在我单击“撤消”按钮后原点总是有一个点?,java,swing,awt,Java,Swing,Awt,你好,我是新来的,也是Java编程新手。最近,我试图在JPanel中编写一个绘图函数。问题是,当我添加新的drawRect(只需在JRadiobutton中选择drawRect,然后在空白处拖动)时,效果很好,但当我按下undo按钮时,原点有一个点。绘制椭圆形和绘制多段线效果良好。有人能帮我吗 (很抱歉我的英语很差,如果你没有理解我的问题,很抱歉你可以尝试运行代码->绘制矩形->单击撤消->在原点有一个点(这就是我试图解释的问题)) package com.jetbrains; 导入java.a

你好,我是新来的,也是Java编程新手。最近,我试图在JPanel中编写一个绘图函数。问题是,当我添加新的drawRect(只需在JRadiobutton中选择drawRect,然后在空白处拖动)时,效果很好,但当我按下undo按钮时,原点有一个点。绘制椭圆形和绘制多段线效果良好。有人能帮我吗

(很抱歉我的英语很差,如果你没有理解我的问题,很抱歉你可以尝试运行代码->绘制矩形->单击撤消->在原点有一个点(这就是我试图解释的问题))

package com.jetbrains;
导入java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入java.awt.image.buffereImage;
公共班机
{
private BufferedImage buffPNG=新的BufferedImage(900550,BufferedImage.TYPE_INT_ARGB);
专用干管()
{
draw_Image img=新的draw_Image();
JFrame=新JFrame(“肯的油漆”);
JButton undo_按钮=新JButton(“undo”);
JRadioButton rb1=新的JRadioButton(“自由手”);
JRadioButton rb2=新的JRadioButton(“Draw Rect”);
JRadioButton rb3=新的JRadioButton(“绘制椭圆形”);
JMenuBar菜单_Bar=新JMenuBar();
撤消按钮。setContentAreaFilled(假);
撤消按钮。设置焦点已绘制(假);
按钮组模式_组=新建按钮组();
模式组添加(rb1);
模式组添加(rb2);
模式组添加(rb3);
img.setDraw_模式(1);
rb1.选择的值(真);
菜单栏添加(rb1);
菜单栏添加(rb2);
菜单栏添加(rb3);
菜单栏。添加(撤消按钮);
frameCreate(frame);
frame.setJMenuBar(菜单栏);
帧。添加(img);
rb1.addActionListener(e->img.setDraw_模式(1));
rb2.addActionListener(e->img.setDraw_模式(2));
rb3.addActionListener(e->img.setDraw_模式(3));
undo_按钮.addActionListener(e->img.undo_按下());
}
类draw_Image扩展了JPanel
{
int layerX=0;
int layerY=0;
int[]polyX=新int[3000];
int[]poly=new int[3000];
int[]厚=新int[10000];
int[]nPoint=新int[10000];
int[]绘图模式=新int[10000];
int[]x=新int[10000][3000];
int[]y=新int[10000][3000];
颜色[]颜色=新颜色[10000];
布尔值=假;
绘制图像()
{
setLayout(空);
立根数(0,0900550);
挫折背景(颜色:浅灰色);
对于(int p=0;p<10000;p++)
{
绘图模式[p]=1;
厚度[p]=3;
颜色[p]=颜色为黑色;
}
addMouseListener(新的MouseAdapter()
{
@凌驾
公共无效mouseClicked(MouseEvent e){super.mouseereleased(e);}
@凌驾
公共无效MouseEvent(MouseEvent e)
{
超级鼠标(e);
如果(拖动)
{
layerX++;
拖动=假;
}
分层=0;
}
});
addMouseMotionListener(新的MouseMotionListener()
{
@凌驾
公共无效鼠标标记(鼠标事件e)
{
拖动=真;
对于(int k=分层;k<3000;k++)
{
x[layerX][k]=e.getX();
y[layerX][k]=e.getY();
}
nPoint[layerX]++;
layerY++;
重新油漆();
}
@凌驾
public void mouseMoved(MouseEvent e){}
});
}
@凌驾
公共空间涂料(图g)
{
超级油漆(g);
图形2d g2=(图形2d)g;
Graphics2D g3=buffPNG.createGraphics();
g2.设置颜色(颜色为白色);
g2.fillRect(0,0900550);
g3.设置颜色(颜色为白色);
g3.fillRect(0,0900550);
/*以多段线形式绘制图像(实现多维数组(使用2D))*/
对于(int i=0;i 0)layerX--;
对于(int j=0;j<3000;j++)
{
x[layerX][j]=0;
y[layerX][j]=0;
}
nPoint[layerX]=0;
设置draw_模式(draw_模式[layerX+1]);
重新油漆();
}
}
私有void frameCreate(JFrame框架)
{
frame.pack();
Insets insetValue=frame.getInsets();
int height=insetValue.top+insetValue.bottom+600-10;
int width=insetValue.left+insetValue.right+900-10;
框架。设置尺寸(宽度、高度);/*设置框架尺寸*/
frame.setLocation(195,50);/*设置帧启动位置*/
frame.setresizeable(false);/*禁用框架调整大小和完整窗口选项*/
frame.setLayout(null);/*将布局设置为null*/
frame.setVisible(true);/*将帧设置为可见*/
frame.getContentPane().setBackground(Color.white);/*设置帧背景色*/
frame.setDefaultCloseOperation(WindowConstants.EXIT ON_CLOSE);/*指定关闭时的默认行为*/
}
公共静态void main(字符串[]args)
{
新的Main();
}
}

无法解决您的问题,但有一些一般提示:

class draw_Image extends JPanel
  • 类名应以大写字符开头
  • 不要在类名中使用“\” 使用API作为类命名约定的指南

    int[] polyX = new int[3000];
    int[] polyY = new int[3000];
    int[] thick = new int[10000];
    int[] nPoint = new int[10000];
    
    不要在整个程序中使用硬编码数字。至少使用一个变量:

    private static int SMALLER_SIZE = 3000;
    private static int LARGER_SIZE = 10000;
    ...
    int[] polyX = new int[SMALLER_SIZE];
    int[] polyY = new int[SMALLER_SIZE];
    int[] thick = new int[LARGER_SIZE];
    int[] nPoint = new int[LARGER_SIZE];
    
    更好的是,不要使用数组。而是使用
    ArrayList
    。那么就不需要为数组的大小随机选择一些大的数字

    int[] polyX = new int[SMALLER_SIZE];
    int[] polyY = new int[SMALLER_SIZE];
    
    不要保留两个数组。如果数据是相关的,那么数据应该存储在对象中。在上述情况下,您可以使用作为JDK一部分的
    对象。因此,使用ArrayList(而不是arrays)的代码如下所示:

    int[] polyX = new int[SMALLER_SIZE]; int[] polyY = new int[SMALLER_SIZE];
    private ArrayList<Point> points = new ArrayList<Point>();
    
    points.add( new Point(...) );
    
    for (int i = 0; i < points.getSize(); I++
    {
        Point p = points.get(i);
        // do something with the Point
    }
    
    public void paint(Graphics g)
    
        g2.setColor(Color.white);
        g2.fillRect(0,0,900,550);
        g3.setColor(Color.white);
        g3.fillRect(0,0,900,550);
    
    DrawImage panel= new DrawImage();
    panel.setBackground(Color.WHITE);