Hidiho,
ich befürchte ich bin in die verhängnisvollen Mühlen des Null-Layouts geraten.
Folgende Situation:
In einem JScrollPane sitzt ein JPanel mit Null-Layout. Auf diesem JPanel sitzen 2 Buttons links oben fürs Zoomen.
Wird der Viewport durch Scrollen verändert, sollen die Buttons ihre Position anpassen, sodass sie im neuen Viewport wieder links oben positioniert sind.
Dazu hab ich am Viewport des Scrollpane das Panel als ChangeListener registriert und immer wenn dieser aufgerufen wird, setze ich die Position der Buttons in Abhängigkeit des Rechtecks des Viewport neu, sodass sie für den Benutzer “die gleiche Position” beibehalten.
In der Praxis kommt es aber zu einem usnchönen Nebeneffekt. Während des Scrollens und somit beim Neupositionieren der Buttons “springen” die Buttons. Wird das Scrollen beendet haben sie die gewünschte Position. Nur während des Scrollens ist dieser Effekt leider zu erkennen.
Ich schätze mal das ganze hat mit dem Null-Layout und dem Neuzeichnen der Buttons zu tun. Gibts ne Möglichkeit das zu verhindern?
Hier ein KSKB:
import java.awt.Dimension;
import java.awt.Rectangle;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JViewport;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class Test extends JPanel implements ChangeListener{
public static void main(String[] args){
JFrame frame = new JFrame("test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Test panel = new Test();
JScrollPane scrollpane = new JScrollPane(panel);
((JViewport) scrollpane.getViewport()).addChangeListener(panel);
frame.add(scrollpane);
frame.setSize(200, 200);
frame.setVisible(true);
}
private JButton zoomIn;
private JButton zoomOut;
public Test(){
setLayout(null);
zoomIn = new JButton("+");
zoomIn.setBounds(5, 10, 20, 20);
zoomOut = new JButton("-");
zoomOut.setBounds(5, 30, 20, 20);
add(zoomIn);
add(zoomOut);
setSize(400, 400);
setPreferredSize(new Dimension(400, 400));
}
@Override
public void stateChanged(ChangeEvent e) {
JViewport viewport = (JViewport) getParent();
Rectangle viewRect = viewport.getViewRect();
zoomIn.setBounds(viewRect.x + 5, viewRect.y + 10, 20, 20);
zoomOut.setBounds(viewRect.x + 5, viewRect.y + 30, 20, 20);
}
}