java中鼠标点击绘制图形时,其他按钮和插入的图片出现错位。

请仔细看两张图,在我点击鼠标绘图时,插入在面板中的图片突然在左侧重复出现,底部名为“测试”的按钮也在顶部重复出现,当然并不是多出一个按钮,它并不能点击,只是出现了那么一个... 请仔细看两张图,在我点击鼠标绘图时,插入在面板中的图片突然在左侧重复出现,底部名为“测试”的按钮也在顶部重复出现,当然并不是多出一个按钮,它并不能点击,只是出现了那么一个影像而已。
如果加入“super.paintComponent(g);”就不会发生这种情况,但是在第二次点击鼠标后之前绘的图形会被清屏。我想每次绘制后之前所绘图像依然保留在面板上同时又不会出现上图那种错误请问高手该怎么办?
以下是代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Myjava
{
public static void main(String args[])
{
new FrameM();
}
}
class FrameM extends JFrame
{
public FrameM()
{
JButton jb = new JButton("测试");
Container c = getContentPane();
c.add(new PanelM(),BorderLayout.CENTER);
c.add(jb,BorderLayout.SOUTH);
setTitle("aaa");
setSize(500,400);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
class PanelM extends JPanel
{
ImageIcon icon = new ImageIcon("app.gif");
JLabel jl = new JLabel(icon,SwingConstants.CENTER);
int x,y;
boolean boo = false;
public PanelM()
{
add(jl);
addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent m)
{
x = m.getX();
y = m.getY();
repaint();
boo = true;
}
});
}
public void paintComponent(Graphics g)
{
if(boo)
g.fillOval(x, y, 20, 20);
}
}
展开
 我来答
百度网友9ccec88
推荐于2016-08-24 · TA获得超过2018个赞
知道大有可为答主
回答量:2154
采纳率:50%
帮助的人:1575万
展开全部

super.paintComponent(g);是必须的,整个面板都要重绘才行,具体机理我也不会熟悉了,swing这东西没怎么研究……

而你加了这个之后,面板重绘,你之前画的东西自然会被擦掉,解决的方法也很简单,每次面板先重绘,然后再画你要画的东西。那么你把你要画的东西先记在list里面,然后每次画的时候,把list里面的东西都画出来,这样不就不会丢失之前的信息了吗,修改部分如下:

class PanelM extends JPanel
{
    ImageIcon icon = new ImageIcon("app.gif");
    JLabel jl = new JLabel(icon, SwingConstants.CENTER);
    int x, y;
    boolean boo = false;

    //新增的list
    private List<Integer> listX = new ArrayList<Integer>();
    private List<Integer> listY = new ArrayList<Integer>();

    public PanelM()
    {
        add(jl);
        addMouseListener(new MouseAdapter()
        {
            public void mousePressed(MouseEvent m)
            {
                x = m.getX();
                y = m.getY();

                //每次都记到list里面
                listX.add(x);
                listY.add(y);

                repaint();
                boo = true;
            }
        });
    }

    public void paintComponent(Graphics g)
    {
        if (boo)
        {
            super.paintComponent(g);
            
            //把list里面的东西都画出来
            for (int i = 0; i < listX.size(); i++)
            {
                g.fillOval(listX.get(i), listY.get(i), 20, 20);
            }
        }
    }
}
永love小潮
2014-12-20
知道答主
回答量:7
采纳率:0%
帮助的人:7765
展开全部
什么意思,我不懂
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式