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
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
Comment