Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich habe ein kleines Programm mit ein JScrollPane mit einem großen Bild.
Wie kann ich mit dem Mausrad horizontal scrollen. Vertikal funktioniert, bewegen ich mein Mausrad aber horizontal nach oben bzw. nach unten und nicht nach links oder rechts.
Mein zweites Problem. Wenn man mit der Maus die ScrollBar bewegt, welcher Listener zeigt mir den aktuellen Wert/Position an.
Der AdjustmentListener gibt mir ja nur den Endwert.
der Satz 'bewegen ich mein Mausrad aber' ist relativ unklar, ich nehme aber an du willst einfach dass beim Scroll horizontal bewegt wird,
das funktioniert bisher auch schon wenn es keine vertikale Scrollbar gibt, reicht dir das? die kann man explizit ausschalten
ansonsten ist die Klasse BasicScrollPaneUI verantwortlich, dort gibts Code a la
Java:
class Handler implements ChangeListener, PropertyChangeListener, MouseWheelListener {
public void mouseWheelMoved(MouseWheelEvent e) {
if (scrollpane.isWheelScrollingEnabled() &&
e.getScrollAmount() != 0) {
JScrollBar toScroll = scrollpane.getVerticalScrollBar();
int direction = 0;
// find which scrollbar to scroll, or return if none
if (toScroll == null || !toScroll.isVisible()) {
toScroll = scrollpane.getHorizontalScrollBar();
if (toScroll == null || !toScroll.isVisible()) {
return;
}
}
dort wird also explizit die vertikale ScrollBar bevorzugt,
um das sauber zu ändern muss man meiner Vermutung nach BasicScrollPaneUI mit 800 Zeilen überschreiben oder zumindest den Listener darin austauschen,
eine einfachere Variante habe ich erfolgreich ausprobiert:
Java:
public class TestGUI extends JFrame {
public TestGUI() {
final long start = System.currentTimeMillis();
JPanel p = new JPanel();
p.setPreferredSize(new Dimension(1000, 1000));
JScrollPane sp = new JScrollPane(p) {
public JScrollBar getVerticalScrollBar() {
StackTraceElement e = Thread.currentThread().getStackTrace()[2];
if ("mouseWheelMoved".equals(e.getMethodName())) {
return super.getHorizontalScrollBar();
}
return super.getVerticalScrollBar();
}
};
add(sp);
setSize(350, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new TestGUI();
}
}
in obigen Code eingefügt, liefert bei mir seitenweise Ausgaben wenn ich mit der Maus die Scrollbar direkt bewege,
bei Mausrad mit großen Sprung wäre es ja klar dass nur wenige Schritte kommen, bei mir sind aber auch ganze 8x "s", was auch immer die Events einzeln bedeuten
dann würde ich das jedenfalls erstmal an einer normalen Komponente mit einem MouseWheelListener testen,
ob überhaupt das Event in Java auf irgendeine Art zu unterscheiden ist