Swing :создание JScrollPane, отображающего компонент по центру?

Если вы создаете JScrollPane, область просмотра которого больше, чем у компонента JScrollPane, он отображает этот компонент в верхнем левом углу.

Есть ли способ изменить это поведение, чтобы оно отображало компонент по центру?

Пример программы ниже.


уточнение:

У меня есть компонент, который имеет (ширину, высоту )= (cw,ch ).

У меня есть JScrollPane с областью просмотра, ширина которой (, высота )= (vw, vh ).

Компонент может стать больше или меньше. Я хотел бы использовать полосы прокрутки для позиционирования центральной точки компонента относительно центральной точки области просмотра, поэтому, если один или оба размера компонента меньше, чем область просмотра, компонент отображается в центре области просмотра.

Поведение области прокрутки по умолчанию позиционирует верхний левый угол компонента относительно верхнего левого угла окна просмотра.

Все, о чем я спрашиваю, это как изменить точку отсчета. Я не уверен, насколько легко это сделать с JScrollPane по умолчанию, поэтому, если это не просто, я узнаю, что могу, и придумаю другой подход.


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);
    }
}
11
задан Jason S 7 May 2012 в 18:25
поделиться