我试图制作一个简单的绘画应用程序。我有一个设置JFrame的main方法,然后使用flowlayout添加JPanel和JLabel。 JLabel用于计算点击次数。
panel类实现了mouselistener和mousemotionlistener。
问题是当我画一些东西或点击面板时,它会将标签添加到JPanel中,并且根据我点击的位置,它可以将它添加两次到面板,这让我很生气。我无法理解为什么它被添加到JPanel。
此外,JPanel被边框包围,当我点击或绘制某些东西时,它会在面板的某处添加一个新的垂直边线,每次都是随机的。
两个类的代码:
public class mainepanel extends JPanel implements MouseMotionListener, MouseListener{
Graphics globalGraphics;
int clickCount = 0;
public mainepanel(){
setBorder(BorderFactory.createLineBorder(Color.black));
setPreferredSize(new DimensionUIResource(200,200));
addMouseMotionListener(this);
addMouseListener(this);
validate();
setFocusable(true);
}
public void paintComponent(Graphics g){
globalGraphics = g.create();
}
@Override
public void mouseDragged(MouseEvent e) {
globalGraphics.fillOval(e.getX(), e.getY(), 10,10);
repaint();
}
@Override
public void mouseClicked(MouseEvent e) {
clickCount ++;
maine.setLabel(clickCount);
globalGraphics.fillOval(e.getX(), e.getY(), 10,10);
repaint();
}
public class maine extends JFrame{
static JLabel label;
public maine(){
setSize(600,400);
setDefaultCloseOperation(3);
setResizable(false);
label = new JLabel("Clicks:");
setLayout(new FlowLayout());
add(label);
add(new mainepanel());
setVisible(true);
}
public static void setLabel(int clicks){
label.setText("Clicks: " + clicks);
}
public static void main(String[]args){
new maine();
}
}
答案 0 :(得分:3)
在paintComponent
内执行所有绘图(并确保致电super.paintComponent
) - MouseListener
/ MouseMotionListener
只需更改数据模型(如有必要)调用repaint
以便UI反映更改)。
下面的简单示例,单击鼠标创建一个圆圈,并拖动鼠标移动:
Point center = null;
...
@Override
public void mouseClicked(MouseEvent e){
center = e.getPoint();
repaint();
}
@Override
public void mouseDragged(MouseEvent e){
center = e.getPoint();
repaint();
}
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
if ( center != null ){
g.fillOval(center.getX(), center.getY(), 10, 10);
}
}