Swing: creating a JScrollPane that displays its component centered?

前端 未结 4 1248
别那么骄傲
别那么骄傲 2021-02-08 02:52

If you create a JScrollPane that has a viewport larger than the JScrollPane\'s component, it displays that component in the upper left.

Is there any way to change this b

4条回答
  •  一整个雨季
    2021-02-08 03:37

    I simply added a JPanelto the JScrollPane to which I added the THINGY JPanel. Hope this is what you wanted :

    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());  
            JPanel panel = new JPanel();
            panel.add(thingy);
            JScrollPane scroll = new JScrollPane();
            scroll.setViewportView(panel);  
            add(scroll, 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);
        }
    }
    

    Here is the output :

    SIMPLE SCROLLER

提交回复
热议问题