4

几年来,我在几个 Java 应用程序中遇到了 Java Swing + 我的 Wacom Graphire 数位板的问题,现在我自己也遇到了。

我在单击鼠标时使用数位板来解决手腕问题,它在 Windows 下运行良好,除非我使用 Java 应用程序。在 Java 应用程序中,单击笔无法正常工作。(通常问题只出现在文件选择对话框或树形控件上。)数位板还附带一个无线鼠标,可与同一个数位板配合使用,单击即可正常工作。

我不知道问题出在 WACOM 驱动程序中还是在 Windows 的 Java Swing 运行时中,或者两者兼而有之。有没有人遇到过这个?我想向 WACOM 提交错误报告,但我不知道该告诉他们什么。

我已经能够在我自己的应用程序中重现这一点,该应用程序有一个 JEditorPane 和一个我添加了 HyperlinkListener 的 HTML 文档。我每次用鼠标单击都会收到 HyperlinkEvent.ACTIVATED 事件,但每次用笔单击时我都不会收到 HyperlinkEvent.ACTIVATED 事件。

笔和鼠标之间的一个很大区别是,当您单击鼠标上的按钮时,很容易在没有鼠标移动的情况下引起按钮单击。在数位板上很难做到这一点,这似乎与缺少 HyperlinkEvent.ACTIVATED 事件有关——如果我在点击数位板时非常小心不要移动笔位置,我想我可以激活事件。

有什么建议可以尝试,以便我可以向 WACOM 提供有关此错误的一些有用信息?无法将我的笔用于 Java 应用程序真的很令人沮丧,特别是因为笔可以在“常规”Windows(非 Java)应用程序中正常工作。

通常我不会在这里问这个问题,但我想从程序员的角度找出可能发生的事情,以便我可以提交一份好的错误报告。

4

4 回答 4

5

您应该做的是添加一个mouseListener并查看它何时注册一个mouseClicked(), mousePressed(),mouseReleased()事件。我不确定秋千是否将平板笔读取为鼠标。但是,它应该让您对实际发生的事情有所了解。

于 2009-04-15T15:15:08.267 回答
2

我尝试了曼哈顿博士的建议,它就像一个魅力。我正确地得到了 mousePressed/mouseReleased 事件;mouseClicked 事件总是发生在数位板鼠标上,但 mouseClicked 事件不会发生在笔上,除非我设法让笔保持静止。即使是 1 像素的移动也足以让它失败。我想我应该为此责怪Java:没有办法为可接受的移动指定“点击半径”。

package com.example.bugs;

import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JFrame;

public class WacomMouseClickBug {
    public static void main(String[] args) {
        JFrame jframe = new JFrame();

        jframe.addMouseListener(new MouseListener(){
            @Override public void mouseClicked(MouseEvent event) {
                System.out.println("mouseClicked: "+event);
            }
            @Override public void mouseEntered(MouseEvent event) {}
            @Override public void mouseExited(MouseEvent event) {}
            @Override public void mousePressed(MouseEvent event) {
                System.out.println("mousePressed: "+event);
            }
            @Override public void mouseReleased(MouseEvent event) {
                System.out.println("mouseReleased: "+event);                
            }           
        });

        jframe.setPreferredSize(new Dimension(400,400));        
        jframe.pack();
        jframe.setLocationRelativeTo(null);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jframe.setVisible(true);
    }
}
于 2009-04-15T15:39:37.680 回答
1

我想你自己已经得到了答案:移动笔会导致其他事件,而不是简单的单击,也许可能是拖放式事件。我不确定这是 Java/Swing 还是 Wacom 问题,可能是平板电脑没有将点击注册为拖动事件,或者可能是 Swing 错误地解释了事件。

于 2009-04-15T15:17:33.723 回答
1

多年前我向 Sun 报告了这个错误。它仍然没有修复。任何体面的 ui 框架都将允许在按下和释放之间进行一些移动以生成点击事件。在高 dpi 显示器上最大移动 1 像素简直是荒谬的。这不仅是 wacom 数位板的问题,即老年人在单击时也难以保持鼠标不动。

于 2012-05-20T18:38:52.213 回答