2010-05-16 16 views
5

Comme beaucoup de souris et de trackpads modernes, mon ordinateur portable supporte le défilement vertical et horizontal. C'est une fonctionnalité addictive une fois que vous vous y êtes habitué. Je veux simplement que mes applications Java supportent le défilement horizontal via le trackpad/mousewheel, mais partout où je cherche il semble que ce n'est pas possible en Java.Comment utiliser mon trackpad pour le défilement horizontal de la molette de la souris dans un Java AWT ScrollPane

Je veux vraiment que quelqu'un me dise que je suis en quelque sorte faire mal, cette fonction est le comportement déjà demandé: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6440198

L'incapacité à faire cette chose simple, est en fait un élément rédhibitoire pour l'application que je suis travaille sur. En fait, pour toute application que je peux imaginer! J'ai investi un peu de temps dans le backend Java, alors j'aimerais vraiment trouver une solution pour cette chose apparemment simple.

Question est ce que je pourrais faire pour implémenter ce comportement? Est-ce que les événements au niveau OS brut me sont même exposés par java, devrais-je alors écrire cela à partir de zéro?

import java.awt.*; 

public class ScrollExample extends Canvas { 

    public void paint(Graphics g) { 

     g.setColor(Color.green); 
     g.fillOval(0,0,400, 400); 

    } 

    public static void main(String[] args) { 

     ScrollExample b = new ScrollExample(); 
     Frame f = new Frame ("Scroll Example"); 

     ScrollPane scroller = new ScrollPane (ScrollPane.SCROLLBARS_ALWAYS); 
     scroller.add(b,"Center"); 
     f.setPreferredSize(new Dimension(500,500)); 
     f.add ("Center",scroller); 
     f.pack(); 
     f.show(); 

    } 

} 

exemple Swing fonctionne avec le défilement horizontal et vertical

import java.awt.*; 
import javax.swing.*; 

public class ScrollExample extends JPanel { 

    public void paint(Graphics g) { 

     super.paint(g); 

     g.setColor(Color.green); 
     g.fillOval(0,0,400, 400); 

    } 

    public static void main(String[] args) { 

     JFrame f = new JFrame ("Scroll Example"); 
     ScrollExample p = new ScrollExample(); 
     p.setPreferredSize(new Dimension(1000, 1000)); 

     JScrollPane scroller = new JScrollPane(p,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
     scroller.getHorizontalScrollBar().setUnitIncrement(10); 
     scroller.getVerticalScrollBar().setUnitIncrement(10); 

     f.setPreferredSize(new Dimension(500,500)); 
     f.add (scroller,BorderLayout.CENTER); 
     f.pack(); 
     f.show(); 
    } 
} 

Répondre

1

Ceci est pris en charge par défaut Swing bien Scolling vertical a la priorité sur le défilement horizontal lorsque les deux barres de défilement sont visibles.

Je m'attendrais à ce que de nouveaux développements soient faits dans Swing pas AWT.

Edit:

Vous devriez être en mesure d'utiliser le Mouse Wheel Controller pour personnaliser la vitesse de défilement. Je n'ai jamais essayé sur le défilement horizontal, laissez-moi savoir si cela fonctionne.

+0

Merci, Swing fonctionne, mais plus lentement que AWT, mais cela pourrait être la configuration par défaut de la roue. Je voulais vraiment utiliser AWT pour les contrôles du système d'exploitation, mais je vais maintenant basculer à la place, la plupart de mon interface utilisateur sera écrasée par moi de toute façon. – blissapp

+0

En ce qui concerne le commentaire sur le défilement lent, voir ma modification ci-dessus. – camickr

+0

Merci pour la mise à jour. J'ai essayé cette classe de contrôleur de molette de souris, mais cela a rendu le défilement lent et saccadé sur mon matériel. Ma solution finale consistait à utiliser la méthode setUnitIncrement() sur les ScrollBars eux-mêmes, j'ai ajouté les détails au code ci-dessus. – blissapp

1

Les événements de navigation sur le trackpad de mon MacBookPro sont traités immédiatement. Notez qu'il existe une méthode sur JScrollPane pour activer les événements de roue: setWheelScrollingEnabled