最近在freelancer上閑逛到别人的一個小問題,大概就是如果電腦是觸摸屏的,不能正确的響應swing裡的滑鼠事件。
這是原代碼段:
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
pointList = new ArrayList<>();
pointList.add(e.getPoint());
startDrag = true;
}
public void mouseReleased(MouseEvent e) {
pointList.add(e.getPoint());
lineList.add(pointList);
pointList = new ArrayList<>();
startDrag = false;
}
});
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
pointList.add(e.getPoint());
repaint();
}
});
表現出來的效果為在移動過程中可以看到繪畫痕迹,松手時消失。
經過分析,java swing在觸摸屏時表現順序為先觸發mouseDragged事件,當松手時才調用mousePressed事件和mouseReleased事件,是以不能正確定留痕迹。
以下是一種面向項目偷懶式的改法(即幹脆不在pressed事件裡初始化),更多對于正經的觸屏的支援可以了解以下awt。
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
pointList.add(e.getPoint());
lineList.add(pointList);
pointList = new ArrayList<>();
startDrag = false;
}
});
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseMoved(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
startDrag = true;
pointList.add(e.getPoint());
repaint();
}
});