天天看點

java swing關于觸摸屏的問題

最近在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();
                    }
                });