Hi,
erstmal eine etwas längere Erklärung, aber ich weiß nicht wie ich es kurz beschreiben soll ;o)
ich habe für eine Anwendung eine JDesktopPane in eine JScrollPane gesteckt und dort drinn existieren mehrere JInternalframes, so dass die JScrollPane auch wirklich genutzt werden muss. Meine Idee war es nun, das JInternalframe immer im ViewPort der JScrollPane zu behalten, auch wenn der User es "aus dem ViewPort rausschiebt"(also er draggt es aus dem sichtbaren Bereich hinaus).
Das ganze hatte ich mit scrollRectToVisible(JInternalframe.getBounds()) gemacht.
Soweit ging das auch gut, allerdings ist mir gestern ein Fehler aufgefallen, den ich nicht ganz verstehe. Ich habe mal ein SSCCE gemacht, welches das Problem ein wenig runterbricht.
Ich habe daraufhin nochmal Internet und Tuts gewühlt, aber überall steht nur, was scrollRectToVisible macht, mehr nicht. Soweit ich das verstanden habe, stellt der Viewport einen Teil des Clients da, den es "scrollen" soll. Wenn ich nun scrollRectToVisible benutzte, gehe ich davon aus, dass die Koordinaten des Clients relevant sind, denn genau das sollte meiner Meinung nach passieren: Man möchte einen Teil des Clients sichtbar machen, der momentan nicht sichtbar ist.
Was Java aber macht ist, das Rectangle relativ zum Viewport zu betrachten.
D.h. wenn ich scrollRectToVisible(new Rectangle(-100,-100,10,10)) benutze, verschiebt er den Ausschnitt um 100 nach links und oben....
Ist das so gewollt oder ein Bug? Dinge in den View zu schieben die schon im View sind bringt nicht viel oder? Oder "Am I doing it wrong?"
Danke für jede Antwort
Mit freundlichen Grüßen
Ellessedil
P.S.: nicht über das Wirrwarr wundern, hab das gestern Abend schnell zusammengeschustert
erstmal eine etwas längere Erklärung, aber ich weiß nicht wie ich es kurz beschreiben soll ;o)
ich habe für eine Anwendung eine JDesktopPane in eine JScrollPane gesteckt und dort drinn existieren mehrere JInternalframes, so dass die JScrollPane auch wirklich genutzt werden muss. Meine Idee war es nun, das JInternalframe immer im ViewPort der JScrollPane zu behalten, auch wenn der User es "aus dem ViewPort rausschiebt"(also er draggt es aus dem sichtbaren Bereich hinaus).
Das ganze hatte ich mit scrollRectToVisible(JInternalframe.getBounds()) gemacht.
Soweit ging das auch gut, allerdings ist mir gestern ein Fehler aufgefallen, den ich nicht ganz verstehe. Ich habe mal ein SSCCE gemacht, welches das Problem ein wenig runterbricht.
Ich habe daraufhin nochmal Internet und Tuts gewühlt, aber überall steht nur, was scrollRectToVisible macht, mehr nicht. Soweit ich das verstanden habe, stellt der Viewport einen Teil des Clients da, den es "scrollen" soll. Wenn ich nun scrollRectToVisible benutzte, gehe ich davon aus, dass die Koordinaten des Clients relevant sind, denn genau das sollte meiner Meinung nach passieren: Man möchte einen Teil des Clients sichtbar machen, der momentan nicht sichtbar ist.
Was Java aber macht ist, das Rectangle relativ zum Viewport zu betrachten.
D.h. wenn ich scrollRectToVisible(new Rectangle(-100,-100,10,10)) benutze, verschiebt er den Ausschnitt um 100 nach links und oben....
Ist das so gewollt oder ein Bug? Dinge in den View zu schieben die schon im View sind bringt nicht viel oder? Oder "Am I doing it wrong?"
Danke für jede Antwort
Mit freundlichen Grüßen
Ellessedil
P.S.: nicht über das Wirrwarr wundern, hab das gestern Abend schnell zusammengeschustert
Java:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
public class TestPane {
private JScrollPane scrollPane;
private Rectangle scrollRect;
public TestPane() {
final JDesktopPane desktopPane = new JDesktopPane() {
private static final long serialVersionUID = -8637284457534199637L;
protected void paintComponent(Graphics g) {
super.paintComponent(g);
((Graphics2D) g).fillRect(scrollRect.x, scrollRect.y, scrollRect.width, scrollRect.height);
}
};
desktopPane.setPreferredSize(new Dimension(2000, 1000));
scrollRect = new Rectangle(100, 100, 100, 100);
scrollPane = new JScrollPane(desktopPane);
scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane.setPreferredSize(new Dimension(800, 600));
Timer timer = new Timer();
timer.schedule(new ScrollTask(900, 700), 3000, 4000);
timer.schedule(new ScrollTask(0, 0), 5000, 4000);
timer.schedule(new TimerTask() {
public void run() {
desktopPane.setPreferredSize(new Dimension(4000, 2000));
scrollPane.revalidate();
System.out.println("DesktopPane-Size doubled!");
}
}, 25000);
timer.schedule(new ScrollTask(-100, -100), 40000, 500);
}
private class ScrollTask extends TimerTask {
private int x;
private int y;
protected ScrollTask(int x, int y) {
this.x = x;
this.y = y;
}
public void run() {
scrollRect.x = x;
scrollRect.y = y;
scrollPane.getViewport().scrollRectToVisible(scrollRect);
scrollPane.repaint();
System.out.println("Scrolled to x=" + x + " and y=" + y);
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("Frame4ScrollPane");
frame.getContentPane().add(new TestPane().getScrollPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
protected JScrollPane getScrollPane() {
return scrollPane;
}
}