Announcement

Collapse
No announcement yet.

Manuelles Draggen in einer JScrollPane

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Manuelles Draggen in einer JScrollPane

    Hallo,

    Ich suche nach einer Möglichkeit mit der Maus in einer JScrollPane den JViewport zu verändern. Ich stelle mir das im Moment so vor: Wenn ich mit der Maus auf einen bestimmten Punkt klicke und dann irgendwohin dragge, bleibt der Mauszeiger immer über dem selben Punkt. Die Position der JViewport soll sich ändern, um dieses Verhalten zu gewährleisten.

    Ich bilde mir ein mein Programmcode tut genau dieses, aber wenn ich ihn ausführe und das 'o' von Hallo verschieben möchte, sieht das ganze sehr ruckelig aus und der Mauszeiger bleibt nicht über dem 'o'. Habe ich nur einen Denkfehler drin, oder ist es ein Synchronisationsproblem der Events und dem verschieben der View?

    <pre>
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;

    public class Example extends JFrame
    implements MouseListener, MouseMotionListener
    {
    private JViewport mVP; // Viewport of scrollpane
    private Point mInitP, mInitVP; // drag event started here

    public void mousePressed(MouseEvent ev) {
    // remember where drag event started
    mInitP = ev.getPoint(); // relative to the label
    mInitVP = mVP.getViewPosition();
    }

    public void mouseDragged(MouseEvent ev) {
    Point tP = ev.getPoint();

    // place where drag started + mouse movement
    int tX = mInitVP.x + (mInitP.x - tP.x);
    int tY = mInitVP.y + (mInitP.y - tP.y);

    mVP.setViewPosition(new Point(tX, tY));
    }

    public void initialize()
    {
    JPanel tPanel = new JPanel();
    Dimension tSize = new Dimension(400, 400);
    tPanel.setMinimumSize(tSize);
    tPanel.setPreferredSize(tSize);

    JLabel tLabel = new JLabel("Hallo, try and drag me!");
    tLabel.addMouseListener(this);
    tLabel.addMouseMotionListener(this);
    tPanel.add(tLabel);

    JScrollPane tSP = new JScrollPane(tPanel);
    mVP = tSP.getViewport();

    getContentPane().add(tSP);
    pack(); setVisible(true);
    }

    public static void main(String[] args)
    {
    Example tExample = new Example();
    tExample.initialize();
    }

    public void mouseClicked(MouseEvent ev) {}
    public void mouseEntered(MouseEvent ev) {}
    public void mouseExited(MouseEvent ev) {}
    public void mouseReleased(MouseEvent ev) {}
    public void mouseMoved(MouseEvent ev) {}
    }
    </pre>

    Grüße,
    John

  • #2
    Hallo John,<br>
    folgendes Beispiel tut mit einem groesseren Image als JLabel, ohne zu<br>
    "ruckeln". Falls Du kein passendes Image hast, schick mir ne mail.
    <pre>
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;

    public class GrabAndDragDemo extends JFrame {

    public GrabAndDragDemo() {

    super("Grab-and-drag Demo");
    ImageIcon ii = new ImageIcon("image.jpg");
    JScrollPane jsp = new JScrollPane(new GrabAndScrollLabel(ii));
    getContentPane().add(jsp);
    setSize(300,250);
    setVisible(true);
    WindowListener l = new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }
    };
    addWindowListener(l);
    }

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

    }

    class GrabAndScrollLabel extends JLabel {

    public GrabAndScrollLabel(ImageIcon i) {
    super(i);
    MouseInputAdapter mia = new MouseInputAdapter() {
    int m_XDifference, m_YDifference;
    Container c;

    public void mouseDragged(MouseEvent e) {
    c = GrabAndScrollLabel.this.getParent();
    if (c instanceof JViewport) {
    JViewport jv = (JViewport) c;
    Point p = jv.getViewPosition();
    int newX = p.x - (e.getX()-m_XDifference);
    int newY = p.y - (e.getY()-m_YDifference);
    int maxX = GrabAndScrollLabel.this.getWidth() - jv.getWidth();
    int maxY = GrabAndScrollLabel.this.getHeight() - jv.getHeight();
    if (newX < 0)
    newX = 0;
    if (newX > maxX)
    newX = maxX;
    if (newY < 0)
    newY = 0;
    if (newY > maxY)
    newY = maxY;
    jv.setViewPosition(new Point(newX, newY));
    }
    }

    public void mousePressed(MouseEvent e) {
    setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_C URSOR));
    m_XDifference = e.getX();
    m_YDifference = e.getY();
    }

    public void mouseReleased(MouseEvent e) {
    setCursor(Cursor.getPredefinedCursor(Cursor.DEFAUL T_CURSOR));
    }
    };

    addMouseMotionListener(mia);
    addMouseListener(mia);
    }

    }
    </pre>
    Klau

    Comment

    Working...
    X