Se si crea un JScrollPane con una finestra più grande del componente JScrollPane, viene visualizzato quel componente in alto a sinistra.Oscillazione: creazione di un JScrollPane che visualizza il componente centrato?
C'è un modo per modificare questo comportamento in modo che venga visualizzato il componente centrato?
programma di esempio di seguito.
chiarimento:
ho un componente che ha (larghezza, altezza) = (cw, ch).
Ho un JScrollPane con una finestra che ha (larghezza, altezza) = (vw, vh).
Il componente potrebbe diventare più grande o più piccolo. Vorrei un modo per utilizzare le barre di scorrimento per posizionare il punto centrale del componente rispetto al punto centrale della finestra, quindi se una o entrambe le dimensioni del componente sono più piccole della finestra, il componente viene visualizzato al centro della finestra.
Il comportamento di scorrimento predefinito posiziona l'angolo in alto a sinistra del componente rispetto all'angolo in alto a sinistra della finestra.
Tutto quello che sto chiedendo è come cambiare il punto di riferimento. Non sono sicuro di quanto sia facile farlo con il JScrollPane predefinito, quindi se non è facile, imparerò cosa posso e penso a un approccio diverso.
package com.example.test.gui;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class SimpleScroller extends JFrame {
static class Thingy extends JPanel
{
private double size = 20.0;
@Override public Dimension getPreferredSize() {
int isize = (int) this.size;
return new Dimension(isize, isize);
}
@Override protected void paintComponent(Graphics g) {
super.paintComponent(g);
int[] x = {0, 100, 100, 0, 0, 75, 75, 25, 25, 50};
int[] y = {0, 0, 100, 100, 25, 25, 75, 75, 50, 50};
Graphics2D g2d = (Graphics2D) g;
AffineTransform at0 = g2d.getTransform();
g2d.scale(size/100, size/100);
g.drawPolyline(x, y, x.length);
g2d.setTransform(at0);
}
public void setThingySize(double size) {
this.size = size;
revalidate();
repaint();
}
public double getThingySize() { return this.size; }
}
public SimpleScroller(String title) {
super(title);
final Thingy thingy = new Thingy();
setLayout(new BorderLayout());
add(new JScrollPane(thingy), BorderLayout.CENTER);
final SpinnerNumberModel spmodel =
new SpinnerNumberModel(thingy.getThingySize(),
10.0, 2000.0, 10.0);
spmodel.addChangeListener(new ChangeListener() {
@Override public void stateChanged(ChangeEvent e) {
thingy.setThingySize((Double) spmodel.getNumber());
}
});
add(new JSpinner(spmodel), BorderLayout.NORTH);
}
public static void main(String[] args) {
new SimpleScroller("simple scroller").start();
}
private void start() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true);
}
}
Per favore, pubblica il Codice, con il quale stai tirando i capelli :-). Grazie a Dio, per questo "Non sto tirando i miei capelli (ancora)", Esempio sarà buono, qualcosa da provare, sarà molto apprezzato :-) –
Non mi sto ancora strappando i capelli (e ancora) Voglio che inserisca il codice che ho, ma posso fare un esempio. –
vuoi dipingere questo serpente al centro del JScrollPane – mKorbel