我正在尝试在Eclipse上做一个小程序。程序是这样的:当我第一次点击框架上的thr面板时,必须绘制一条关于我的鼠标监听器的Y位置的线。该线占据了面板的所有宽度。在第二次单击时,必须绘制另一条线,再次关于我单击的位置的Y位置。之后,我会在两条线之间放一个小圆圈并用它制作一个小动画。 但现在,我有一个问题。当我单击面板时,会绘制一条线,但如果我再次单击,则第一行消失,第二行将其取消... 这是painComponent和我的mousr监听器的代码。这有什么问题?
public Lines() {
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
posY=e.getY();
posX=e.getX();
nbClic=e.getClickCount();
repaint();
}
});
setBackground(Color.black);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.blue);
if(nbClic>=1){
line1=new Line2D.Double(0, posY, getWidth(), posY);
g2d.draw(line1);
repaint();
}
if(nbClic>=2){
g2d.setColor(Color.YELLOW);
line2=new Line2D.Double(0, posY, getWidth(), posY);
g2d.draw(line2);
}
repaint();
}
答案 0 :(得分:1)
绘画是绘制整个组件的事件。你不能依赖过去的事件,因为每次重绘都会被删除。
您需要保留List
之类的内容,每次创建新行时,都会将其添加到List
。
List<Integer> yClicks = new ArrayList<>();
... {
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
yClicks.add(e.getY());
repaint();
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g.create();
for(int y : yClicks) {
g2d.draw(new Line2D.Double(0, y, getWidth(), y));
}
g2d.dispose();
}
此外:
repaint
内拨打paintComponent
!这将导致无休止的重绘周期。paintComponent
是受保护的方法,除非有令人信服的理由将其公开,否则应保持这种方式。Graphics
的{{1}}对象的状态,因为它在别处使用。通常我们会创建一个本地副本,在我们完成时将其处理。