4 Stimmen

Java Swing Debugging mit dem Wacom Stifttablett

Ich habe seit einigen Jahren in verschiedenen Java-Anwendungen ein Problem mit Java Swing und meinem Wacom Graphire-Tablett und bin nun auch in meiner eigenen Anwendung darauf gestoßen.

Ich verwende ein Stifttablett, um Probleme mit dem Handgelenk beim Klicken mit der Maus zu umgehen, und das funktioniert unter Windows gut, außer wenn ich Java-Anwendungen verwende. In Java-Anwendungen funktioniert der Einfachklick des Stifts nicht richtig. (Normalerweise tritt das Problem nur bei Dialogfeldern für die Dateiauswahl oder bei Baumsteuerungen auf). Im Lieferumfang des Stifttabletts ist auch eine kabellose Maus enthalten, die mit demselben Tablet funktioniert, und deren Einzelklick funktioniert korrekt.

Ich weiß nicht, ob das Problem im WACOM-Treiber oder in der Java Swing-Laufzeitumgebung für Windows oder in beiden liegt. Ist jemandem dieses Problem schon einmal begegnet? Ich würde gerne einen Fehlerbericht bei WACOM einreichen, aber ich habe keine Ahnung, was ich ihnen sagen soll.

Ich war in der Lage, dies in meiner eigenen Anwendung zu reproduzieren, die eine JEditorPane mit einem HTML-Dokument hat, dem ich einen HyperlinkListener hinzugefügt habe. Ich erhalte HyperlinkEvent.ACTIVATED Ereignisse auf jeden einzelnen Klick mit der Maus, aber ich bekomme NICHT HyperlinkEvent.ACTIVATED Ereignisse auf jeden einzelnen Klick mit dem Stift.

Ein großer Unterschied zwischen einem Stift und einer Maus besteht darin, dass es bei einem Mausklick sehr einfach ist, die Taste ohne Mausbewegung zu drücken. Auf dem Stifttablett ist es sehr schwer, dies zu tun, und das scheint mit dem Fehlen von HyperlinkEvent.ACTIVATED-Ereignissen zu korrelieren - wenn ich sehr vorsichtig bin, die Stiftposition nicht zu bewegen, wenn ich auf das Tablett tippe, denke ich, dass ich ACTIVATED-Ereignisse erhalten kann.

Haben Sie Vorschläge, was ich ausprobieren könnte, damit ich WACOM einige gute Informationen über diesen Fehler geben kann? Es ist wirklich frustrierend, dass ich meinen Stift nicht mit Java-Anwendungen verwenden kann, zumal der Stift mit "normalen" Windows-Anwendungen (ohne Java) gut funktioniert.

Normalerweise würde ich diese Frage hier nicht stellen, aber ich würde gerne von einem des Programmierers was los sein könnte, damit ich einen guten Fehlerbericht einreichen kann.

5voto

dr.manhattan Punkte 4632

Sie sollten eine mouseListener und sehen Sie, wann es eine mouseClicked() , mousePressed() , mouseReleased() Veranstaltung. Ich bin mir allerdings nicht sicher, ob der Swing den Tablet-Stift als Maus erkennt. Es sollte Ihnen jedoch einen Einblick geben, was tatsächlich vor sich geht.

2voto

Jason S Punkte 178087

Ich habe den Vorschlag von dr.manhattan ausprobiert und es funktioniert wie ein Zauber. Ich bekomme mousePressed/mouseReleased Ereignisse richtig; mouseClicked Ereignisse passieren immer mit der Stift-Tablett-Maus, aber mouseClicked Ereignisse passieren nicht mit dem Stift, es sei denn, ich verwalten, um den Stift sehr ruhig zu halten. Selbst eine 1-Pixel-Bewegung reicht aus, damit es nicht funktioniert. Ich schätze, ich sollte Java dafür verantwortlich machen: Es gibt keine Möglichkeit, einen "Klickradius" für akzeptable Bewegung anzugeben.

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

1voto

Jorn Punkte 17575

Ich glaube, Sie haben die Antwort bereits selbst gefunden: Das Bewegen des Stifts führt zu einem anderen Ereignis als einem einfachen Klick, vielleicht zu einem Drag & Drop ähnlichen Ereignis. Ich bin mir nicht sicher, ob es ein Java/Swing- oder ein Wacom-Problem ist. Es könnte sein, dass das Tablett die Klicks nicht als solche registriert, sondern als Drag-Events, oder es könnte sein, dass Swing die Events falsch interpretiert.

1voto

Chatterbox Punkte 11

Ich habe diesen Fehler vor vielen Jahren an Sun gemeldet. Er ist immer noch nicht behoben. Jede anständige ui-Framework wird einige Bewegung zwischen einem Drücken und Loslassen erlauben, um ein Klick-Ereignis zu erzeugen. Eine maximale Bewegung von 1 Pixel auf einem Display mit hoher Auflösung ist einfach lächerlich. Es ist nicht nur ein Problem mit Wacom-Tablets, d.h. ältere Menschen haben auch Schwierigkeiten, die Maus beim Klicken ruhig zu halten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X