Pergunta

Fui correndo contra um problema com java swing + meu tablet Wacom Graphire por alguns anos em várias aplicações Java e agora encontrou-lo em meu próprio.

Eu uso uma caneta para obter em torno de questões de pulso enquanto clica um rato, e ele funciona muito bem no Windows, exceto quando estou usando aplicativos Java. Em aplicações Java, o único clique da caneta não funciona corretamente. (Normalmente, o problema ocorre apenas com caixas de diálogo arquivo-seleção ou controles de árvore.) A caneta também vem com um mouse sem fio que funciona com o mesmo tablet, e seu único clique funciona corretamente.

Eu não sei se o problema está no driver WACOM ou no tempo de execução Java Swing para Windows ou ambos. Alguém encontrou isso antes? Eu gostaria de apresentar um relatório de bug com WACOM mas não tenho idéia do que dizer a eles.

Eu tenho sido capaz de reproduzir isso em meu próprio aplicativo que tem um JEditorPane com um documento HTML que eu adicionei um HyperlinkListener para. Recebo eventos HyperlinkEvent.ACTIVATED em cada único clique com o mouse, mas eu não obter eventos HyperlinkEvent.ACTIVATED em cada único clique com a caneta.

Uma grande diferença entre uma caneta e um rato é que quando você clica em um botão em um mouse, é realmente fácil de fazer com que o clique de botão, sem o movimento do mouse. No tablet caneta é muito difícil fazer isso, e que parece correlacionar-se com a falta de eventos HyperlinkEvent.ACTIVATED - se eu sou muito cuidadoso para não mover a posição da caneta quando eu toque no tablet, eu acho que pode ficar ativado eventos.

Todas as sugestões para coisas para tentar que eu possa dar WACOM algumas boas informações sobre este erro? É realmente frustrante não ser capaz de usar minha caneta com aplicativos Java, especialmente desde que a caneta funciona bem com o Windows aplicativos "regulares" (não-Java).

Normalmente eu não faria essa pergunta aqui, mas eu gostaria de descobrir a partir de um ponto de vista do programador que poderia estar acontecendo para que eu possa apresentar um relatório bom bug.

Foi útil?

Solução

O que você deve fazer é adicionar um mouseListener e ver quando ele registra um mouseClicked(), mousePressed(), evento mouseReleased(). Eu não tenho certeza se o balanço lê a caneta tablet como um rato embora. No entanto, deve dar-lhe algumas dicas sobre o que está realmente acontecendo.

Outras dicas

Eu tentei a sugestão de dr.manhattan e funciona como um encanto. Recebo eventos mousePressed / mouseReleased corretamente; eventos mouseClicked acontecer sempre com o mouse caneta, mas mouseClicked eventos não acontecem com a caneta, a menos que eu consiga manter a caneta muito quieto. Mesmo um movimento de 1 pixel é suficiente para torná-lo falhar. Eu acho que deveria culpar Java para um presente: não há nenhuma maneira para especificar um "raio clique" para o movimento acceptible

.
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);
    }
}

Eu acho que você já tem a resposta a si mesmo: Mover os resultados de caneta em algum outro evento do que um simples clique, talvez, talvez um arrastar e soltar como evento. Eu não tenho certeza se é um Java / Swing ou um problema de Wacom, pode ser que o tablet não registra os cliques como tal, mas como eventos de arrasto, ou pode ser que interpreta balanço dos eventos incorretamente.

I reportou este bug há muitos anos para a Sun. Ele ainda não é fixo. Qualquer quadro ui decente vai permitir algum movimento entre uma prensa e liberação para gerar um evento de clique. Um movimento máximo de 1 pixel em uma alta de exibição dpi é apenas ridículo. Não é apenas um problema com Wacom tablets, ou seja, as pessoas mais velhas também têm dificuldades para manter o mouse ainda quando o botão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top