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);
}
} 展开
如果加入“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);
}
} 展开
展开全部
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);
}
}
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询