Scrolling und mouseEvents gleichzeitig abfangen

Hallo.

Kann man während des Scrolling Prozesses auch mouseReleased abfangen? Bei meinem Beispiel “verschluckt” er immer während ich mit dem Mausrad scrolle jegliche MouseEvents(wie z.B. mouseReleased).

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.ScrollPane;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseWheelEvent;
import java.util.EventListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.plaf.basic.BasicScrollBarUI;

public class ATestScrollBar {

    private JScrollBar scrollBar;
    private JFrame frame;  

    public ATestScrollBar() {
        frame = new JFrame();
        frame.setSize(800, 600);
        frame.setTitle("Scrollable");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setBackground(new Color(255, 255, 255));
        frame.setLocationRelativeTo(null);
        frame.setLayout(null);

        MyScrollPane scrollPane = new MyScrollPane();
        scrollPane.setBounds(0, 0, 800, 600);
        frame.add(scrollPane);

        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new ATestScrollBar();
    }

    public class MyScrollPane extends JComponent implements MouseListener {

        public MyScrollPane() {
            JScrollPane scroll = new JScrollPane(this);
            this.addMouseListener(this);
            scrollBar = scroll.getVerticalScrollBar();
            
            scrollBar.setUI(new AScrollBarUI());
            scrollBar.setBounds(750, 50, 5, 500);
            frame.add(scrollBar);
        }

        @Override
        public void mouseClicked(MouseEvent e) {
            
        }

        @Override
        public void mousePressed(MouseEvent e) {
            
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            System.err.println("PRESSED");
        }

        @Override
        public void mouseEntered(MouseEvent e) {
            
        }

        @Override
        public void mouseExited(MouseEvent e) {
           
        }

    }
    
    public class AScrollBarUI extends BasicScrollBarUI {

        private JButton button = new JButton() { 
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(0, 0);
            }
        };

        @Override
        protected void paintTrack(Graphics g, JComponent c, Rectangle trackBounds) {
        }

        @Override
        protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) {
            g.setColor(new Color(20,20,20));
            g.fillRect(thumbBounds.x, thumbBounds.y, thumbBounds.width, thumbBounds.height);
        }

        @Override
        protected JButton createDecreaseButton(int orientation) {
            return button;
        }

        @Override
        protected JButton createIncreaseButton(int orientation) {
            return button;
        }
    }
    
}

Das sind Ereignisse und die entsprechenden Methoden werden nur dann aufgerufen, wenn sie eintreffen. Das heisst, unabhängig davon, ob das Mausrad bewegt wird und während dessen ein Button losgelassen wird, wird auch “mouseReleased()” aufgerufen. Zum Empfang von MouseWheelEvents brauchst du aber einen MouseWheelListener.

was heißt ‘während des Scrolling Prozesses’?
das Mausrad zu bewegen und gleichzeitig noch Tasten zu drücken ist ja fast eine Aufgabe für Supertalente

Loslassen bei mit Mausklick bewegten Scrollbalken ist dagegeb vielleicht eher an normalen Scrollereignis festzuhalten, aber darüber könnte man noch reden,

ist der Aufbau so schon gesichert? sieht ja ziemlich wild aus, wieso die ScrollBar von einem JScrollPane klauen, geht keine normale?
und spricht etwas gegen ein tatsächliches JScrollPane?

Ich habe es ja auch schon mal mit einem mouseWheelListener getestet - während ich dann mit dem Mausrad scrolle kann man kein mouseReleased empfangen, die VM ignoriert das dann und erst nachdem mouseWheel nicht mehr aufgerufen wird kann man wieder mit der Maus klicken und er nimmt das Event wieder an…
Aber irgendwie muss es ja möglich sein das trotzdem beide Events gleichzeitig aufgerufen werden viell. in dem man es in einen eigenen Thread tut?

was heißt ‚während des Scrolling Prozesses‘?
das Mausrad zu bewegen und gleichzeitig noch Tasten zu drücken ist ja fast eine Aufgabe für Supertalente

Nein ist es nicht meistens wenn man mit dem Mausrad etwas kräftiger scrollt, scrollt die ScrollBar automatisch weiter und wird langsamer während dieser Zeit kann man auch nicht irgendwas anklicken und das stört mich da man selber nicht mehr aktiv scrollt und die Scrollbar langsam ausklingt sollte es doch möglich sein schon etwas in der Komponente anzuklicken…

in der Bewegung etwas in dem Panel zu treffen ist ja noch schwieriger als sowieso schon zu scrollen und zu klicken gleichzeitig :wink:
aber dein Konstrukt ist ja so speziell dass sich nicht unbedingt etwas bewegen muss…

wie kannst du im Moment überhaupt scrollen?
anders als bei einem richtigen JScrollPane tut sich bei mir nur mit ‚View‘ und ScrollBar separat hinsichtlich Mausrad nix,
wobei auch mit Klicken nicht viel geht bei mir, eine sanfte Bewegung, schon ist der schwarze Kasten ganz unten,

ohne spezielle AI ScrollBar mit Klicks bewegbar, aber immer noch kein Mausrad verwendbar,
ob beim manuell eingefügten ‚View‘ oder direkt auf der Scrollbar versucht,
bei dir geht das alles besser?


wenn dein Nachbau sich letzlich auch mitbewegen sollte, was spricht erneut nachgefragt gegen ein komplett normales JScrollPane?
damit funktioniert bei mir auch AScrollBarUI akzeptabel,

und keine Probleme mit Klicken gleichzeitig, so weit ich das ungefähr testen kann, ‚Ausklingen‘ habe ich nicht

[QUOTE=Sharoll]Ich habe es ja auch schon mal mit einem mouseWheelListener getestet - während ich dann mit dem Mausrad scrolle kann man kein mouseReleased empfangen…[/QUOTE]Events werden schon in einem eigenen Thread (dem EDT) verteilt und das in der Reihenfolge in welcher sie auftreten.
Die JVM bekommt Input-Events (Maus, Tastatur) btw auch vom Betriebssystem, also könnte auch schon der Maustreiber oder gar die Maus selber dafür verantwortlich sein, dass bei bewegtem Mausrad keine Tasten-Events übertragen werden und diese stattdessen an die Übertragung der Wheel-Events angehängt werden.

@Spacerat
hast du das Programm schonmal laufen lassen, kannst du scrollen mit Mausrad in diesem Aufbau?

Ich habe da noch kurzerhand einen MouseWheelListener eingepflegt und dann versucht einen Button loszulassen, während sich das Mausrad bewegt. Leider Ohne Erfolg. :wink:
Es kommen zwar die Wheel-Events an und danach auch ein Released-Event aber die Scrollbar bewegt sich dadurch keinen Pixel weit.

wenn dein Nachbau sich letzlich auch mitbewegen sollte, was spricht erneut nachgefragt gegen ein komplett normales JScrollPane?

Was meinst du mit normalen JScrollPane?

und keine Probleme mit Klicken gleichzeitig, so weit ich das ungefähr testen kann, ‚Ausklingen‘ habe ich nicht

Und wie hast du das abgeschaltet das es nicht automatisch ausklingt?

[QUOTE=SharolL]Was meinst du mit normalen JScrollPane?
[/QUOTE]
ein JScrollPane ist eine Swing-Komponente (die du in deinem Code teils auch erzeugst) bestehend aus einer View, Scrollbalken je nach Bedarf und rundum-glücklich-Steuerung,
etwa dass Mausrad über View die ScrollBar verändert,
etwa dass Veränderungen der ScrollBar dann auch die View ändern,

eben ein JScrollPane, ein Gesamtpaket von Nützlichkeit

du brichst dagegen dir ScrollBar brutal heraus, fügst diese wie auch die normale JComponent MyScrollPane einzeln ein,
bei mir funktioniert Mausrad nicht,
im Moment hat Änderung der ScrollBar keine Auswirkungen usw.

Und wie hast du das abgeschaltet das es nicht automatisch ausklingt?

schwierig zu beurteilen wer was meint,
ganz hartes sprunghaftes Scrollen habe ich auch nicht, nach einmaliger Mausradbewegung dauert es durchaus auch halbe Sekunde bis Bild wieder ruhig steht,

ich hatte zuletzt noch drastischeres im Sinn, aber vielleicht gibt es das auch nicht, schon gar nicht von dir gemeint

Wenn Ihr dieses Beispiel hier mal versucht klappt das dann bei euch das ihr während des Scrollens klicken könnt.
Bei mir geht es jedenfalls nicht vielleicht liegts auch am Computer.

 * Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Oracle or the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */ 

package components;

import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.*;

/* 
 * ScrollDemo.java requires these files:
 *   Rule.java
 *   Corner.java
 *   ScrollablePicture.java
 *   images/flyingBee.jpg
 */
public class ScrollDemo extends JPanel
                        implements ItemListener, MouseListener {
    private Rule columnView;
    private Rule rowView;
    private JToggleButton isMetric;
    private ScrollablePicture picture;

    public ScrollDemo() {
       
        setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));

        ImageIcon bee = null;
        try {
            bee = new ImageIcon(ImageIO.read(new URL("http://images.forwallpaper.com/files/images/6/6606/66064d8c/616848/beautiful-country-road.jpg")));
        } catch (Exception ex) {
            throw new IllegalStateException("Bild konnte nicht geladen werden.");
        }

        columnView = new Rule(Rule.HORIZONTAL, true);
        rowView = new Rule(Rule.VERTICAL, true);

        if (bee != null) {
            columnView.setPreferredWidth(bee.getIconWidth());
            rowView.setPreferredHeight(bee.getIconHeight());
        } else {
            columnView.setPreferredWidth(320);
            rowView.setPreferredHeight(480);
        }

        JPanel buttonCorner = new JPanel(); 
        isMetric = new JToggleButton("cm", true);
        isMetric.setFont(new Font("SansSerif", Font.PLAIN, 11));
        isMetric.setMargin(new Insets(2,2,2,2));
        isMetric.addItemListener(this);
        buttonCorner.add(isMetric); 

        picture = new ScrollablePicture(bee, columnView.getIncrement());
        picture.addMouseListener(this);
        JScrollPane pictureScrollPane = new JScrollPane(picture);
        pictureScrollPane.addMouseListener(this);
        pictureScrollPane.setPreferredSize(new Dimension(300, 250));
        pictureScrollPane.setViewportBorder(
                BorderFactory.createLineBorder(Color.black));

        pictureScrollPane.setColumnHeaderView(columnView);
        pictureScrollPane.setRowHeaderView(rowView);

        pictureScrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER,
                                    buttonCorner);
        pictureScrollPane.setCorner(JScrollPane.LOWER_LEFT_CORNER,
                                    new Corner());
        pictureScrollPane.setCorner(JScrollPane.UPPER_RIGHT_CORNER,
                                    new Corner());

        add(pictureScrollPane);
        setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
    }

    public void itemStateChanged(ItemEvent e) {
        if (e.getStateChange() == ItemEvent.SELECTED) {
            rowView.setIsMetric(true);
            columnView.setIsMetric(true);
        } else {
            rowView.setIsMetric(false);
            columnView.setIsMetric(false);
        }
        picture.setMaxUnitIncrement(rowView.getIncrement());
    }

    protected static ImageIcon createImageIcon(String path) {
        java.net.URL imgURL = ScrollDemo.class.getResource(path);
        if (imgURL != null) {
            return new ImageIcon(imgURL);
        } else {
            System.err.println("Couldn't find file: " + path);
            return null;
        }
    }

    private static void createAndShowGUI() {
        JFrame frame = new JFrame("ScrollDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        

        JComponent newContentPane = new ScrollDemo();
        newContentPane.setOpaque(true); 
        frame.setContentPane(newContentPane);

        frame.pack();
        frame.setSize(800,300);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        
    }

    @Override
    public void mousePressed(MouseEvent e) {
        
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        System.err.println("Click");
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        
    }

    @Override
    public void mouseExited(MouseEvent e) {
       
    }
}
 * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Oracle or the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */ 

package components;

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

/* ScrollablePicture.java is used by ScrollDemo.java. */

public class ScrollablePicture extends JLabel
                               implements Scrollable,
                                          MouseMotionListener {

    private int maxUnitIncrement = 1;
    private boolean missingPicture = false;

    public ScrollablePicture(ImageIcon i, int m) {
        super(i);
        if (i == null) {
            missingPicture = true;
            setText("No picture found.");
            setHorizontalAlignment(CENTER);
            setOpaque(true);
            setBackground(Color.white);
        }
        maxUnitIncrement = m;

        //Let the user scroll by dragging to outside the window.
        setAutoscrolls(false); //enable synthetic drag events
        addMouseMotionListener(this); //handle mouse drags
    }

    //Methods required by the MouseMotionListener interface:
    public void mouseMoved(MouseEvent e) { }
    public void mouseDragged(MouseEvent e) {
        //The user is dragging us, so scroll!
        Rectangle r = new Rectangle(e.getX(), e.getY(), 1, 1);
        scrollRectToVisible(r);
    }

    public Dimension getPreferredSize() {
        if (missingPicture) {
            return new Dimension(320, 480);
        } else {
            return super.getPreferredSize();
        }
    }

    public Dimension getPreferredScrollableViewportSize() {
        return getPreferredSize();
    }

    public int getScrollableUnitIncrement(Rectangle visibleRect,
                                          int orientation,
                                          int direction) {
        //Get the current position.
        int currentPosition = 0;
        if (orientation == SwingConstants.HORIZONTAL) {
            currentPosition = visibleRect.x;
        } else {
            currentPosition = visibleRect.y;
        }

        //Return the number of pixels between currentPosition
        //and the nearest tick mark in the indicated direction.
        if (direction < 0) {
            int newPosition = currentPosition -
                             (currentPosition / maxUnitIncrement)
                              * maxUnitIncrement;
            return (newPosition == 0) ? maxUnitIncrement : newPosition;
        } else {
            return ((currentPosition / maxUnitIncrement) + 1)
                   * maxUnitIncrement
                   - currentPosition;
        }
    }

    public int getScrollableBlockIncrement(Rectangle visibleRect,
                                           int orientation,
                                           int direction) {
        if (orientation == SwingConstants.HORIZONTAL) {
            return visibleRect.width - maxUnitIncrement;
        } else {
            return visibleRect.height - maxUnitIncrement;
        }
    }

    public boolean getScrollableTracksViewportWidth() {
        return false;
    }

    public boolean getScrollableTracksViewportHeight() {
        return false;
    }

    public void setMaxUnitIncrement(int pixels) {
        maxUnitIncrement = pixels;
    }
}
 * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Oracle or the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */ 

package components;

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

/* Rule.java is used by ScrollDemo.java. */

public class Rule extends JComponent {
    public static final int INCH = Toolkit.getDefaultToolkit().
            getScreenResolution();
    public static final int HORIZONTAL = 0;
    public static final int VERTICAL = 1;
    public static final int SIZE = 35;

    public int orientation;
    public boolean isMetric;
    private int increment;
    private int units;

    public Rule(int o, boolean m) {
        orientation = o;
        isMetric = m;
        setIncrementAndUnits();
    }

    public void setIsMetric(boolean isMetric) {
        this.isMetric = isMetric;
        setIncrementAndUnits();
        repaint();
    }

    private void setIncrementAndUnits() {
        if (isMetric) {
            units = (int)((double)INCH / (double)2.54); // dots per centimeter
            increment = units;
        } else {
            units = INCH;
            increment = units / 2;
        }
    }

    public boolean isMetric() {
        return this.isMetric;
    }

    public int getIncrement() {
        return increment;
    }

    public void setPreferredHeight(int ph) {
        setPreferredSize(new Dimension(SIZE, ph));
    }

    public void setPreferredWidth(int pw) {
        setPreferredSize(new Dimension(pw, SIZE));
    }

    protected void paintComponent(Graphics g) {
        Rectangle drawHere = g.getClipBounds();

        // Fill clipping area with dirty brown/orange.
        g.setColor(new Color(230, 163, 4));
        g.fillRect(drawHere.x, drawHere.y, drawHere.width, drawHere.height);

        // Do the ruler labels in a small font that's black.
        g.setFont(new Font("SansSerif", Font.PLAIN, 10));
        g.setColor(Color.black);

        // Some vars we need.
        int end = 0;
        int start = 0;
        int tickLength = 0;
        String text = null;

        // Use clipping bounds to calculate first and last tick locations.
        if (orientation == HORIZONTAL) {
            start = (drawHere.x / increment) * increment;
            end = (((drawHere.x + drawHere.width) / increment) + 1)
                  * increment;
        } else {
            start = (drawHere.y / increment) * increment;
            end = (((drawHere.y + drawHere.height) / increment) + 1)
                  * increment;
        }

        // Make a special case of 0 to display the number
        // within the rule and draw a units label.
        if (start == 0) {
            text = Integer.toString(0) + (isMetric ? " cm" : " in");
            tickLength = 10;
            if (orientation == HORIZONTAL) {
                g.drawLine(0, SIZE-1, 0, SIZE-tickLength-1);
                g.drawString(text, 2, 21);
            } else {
                g.drawLine(SIZE-1, 0, SIZE-tickLength-1, 0);
                g.drawString(text, 9, 10);
            }
            text = null;
            start = increment;
        }

        // ticks and labels
        for (int i = start; i < end; i += increment) {
            if (i % units == 0)  {
                tickLength = 10;
                text = Integer.toString(i/units);
            } else {
                tickLength = 7;
                text = null;
            }

            if (tickLength != 0) {
                if (orientation == HORIZONTAL) {
                    g.drawLine(i, SIZE-1, i, SIZE-tickLength-1);
                    if (text != null)
                        g.drawString(text, i-3, 21);
                } else {
                    g.drawLine(SIZE-1, i, SIZE-tickLength-1, i);
                    if (text != null)
                        g.drawString(text, 9, i+3);
                }
            }
        }
    }
}
 * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Oracle or the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */ 

package components;

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

/* Corner.java is used by ScrollDemo.java. */

public class Corner extends JComponent {
    protected void paintComponent(Graphics g) {
        // Fill me with dirty brown/orange.
        g.setColor(new Color(230, 163, 4));
        g.fillRect(0, 0, getWidth(), getHeight());
    }
}

Ich kapier’s nicht. Wenn man das Mausrad einen “Tick” dreht, bewegt sich das Bild ein Stück. Wann man dann “währenddessen” klicken soll, weiß ich nicht.

schönes Programm mit Linealen, übrigens mit ganz normalen JScrollPane, nix mit VerticalScrollBar einzeln bisher (von mir aber unten doch noch was dazu…)

im Gegensatz zum Browser habe ich dort (wie immer in Java, ich sollte es wissen…) ruckartiges Scrollen, alles andere wäre auch nervig, aber genug dazu :wink:

beim Scrollen mit Mausrad und gleichzeitigen Klicks ist mir wiederum soweit überhaupt ausführbar kein Klickverlust bemerkbar

übrigens, aber von dir kaum gemeint:
wenn man den Scrollbalken mit links anklickt und gedrückt hält, damit das Bild die ganze Zeit bewegen kann,
und dann in das Bild hineingeht und rechts klickt, dann gibt es keine Ereignisse, jedenfalls nicht für den normalen MouseListener auf das JScrollPane,
ein Listener auf die VerticalScrollBar erhält diese Klicks, sind dieser Komponente zugeordnet,

ich habe keinen besonderen Anlass daran zu glauben, aber vielleicht hilft es bei dir, auf die VerticalScrollBar einen MouseListener zu adden,

@TO:
Also was du da haben willst, kann ich nicht nachvollziehen. Auf jeden Fall hängt gleichzeitiges Scrollen und Klicken von der Maus-Hardware bzw. -Treiber ab, zumindest relativ gleichzeitig Scrollen und Klicken, denn tatsächlich geht beides niemals gleichzeitig, was der seriellen Datenübertragung zwischen Maus und Computer geschuldet ist. Einige Mäuse übertragen ausschliesslich Scrolldaten solange das Rad bewegt wird und puffern anfallende Klicks solange um sie dann hinten dran zu hängen, die meisten Mäuse aber übertragen schlicht Move-, Klick- und Scrollcounts gleichzeitig blockweise in einem Datenpaket. Wie auch immer, innerhalb von Java hat man da keinen Einfluss drauf.
Das einzige, was ich mir noch vorstellen kann, wäre der Scrolltype, wobei Block-Scroll die View abschnittweise (“ruckelnd”) und Unit-Scroll zeilen- oder pixelweise bewegt (kann auch sein, dass es umgekehrt ist). Mit langsam ausklingen ist da zumindest nichts.

Ok danke an alle.

Ich habe es jetzt mal mit verschiedenen Mäusen getestet. Das liegt also wirklich an der Maus selber ob sie beides nahezu gleichzeitig übertragen kann oder nicht. Auch das mit dem langsam Ausklingen ist nicht bei jeder Maus. Manche stoppen abrupt und manche eben nicht. Aber gut zu wissen :wink: