javaswingjviewport

Always center the focused JPanel


I got a project where I always want to center the focused JPanel. So I thought I can just change the Viewport position. But I can't use the viewport. I created an example project to show how I use the viewport. I just want that the user only see one of the orange boxes. But it should be also possible to view all boxes at once. So the view has to zoom in or something like this. How can I fix this problem? My example:

import javax.swing.*;
import java.awt.*;


public class main {

    public static void main(String [] args){
        //create JFrame
        JFrame _frame = new JFrame();

        //create Viewport
        JViewport _view = new JViewport();

        //create Mainpanel
        JPanel _mainPanel = new JPanel();

        //tell the view to handle mainpanel
        _view.setView(_mainPanel);

        //create Layout
        GridLayout _layout = new GridLayout(3,3,3,3);

        //set gridlayout to mainpanel
        _mainPanel.setLayout(_layout);




        for(int i = 0;i<12;i++){
            JPanel _tempPanel = new JPanel();
            _tempPanel.setBackground(Color.ORANGE);
            _tempPanel.setBorder(BorderFactory.createLineBorder(Color.black));

            _mainPanel.add(_tempPanel);
        }


        _view.setExtentSize(new Dimension(300,300));

        //add mainpanel to frame
        _frame.add(_mainPanel);


        _frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        _frame.pack();
        //set size of Jframe
        _frame.setSize(1000,1000);
        _frame.setVisible(true);
    }
}

Solution

  • JViewPort can not help you with your requirement. Here is an ugly but running code. You can improve it yourself.

    public static void main(String[] args) {
    
        // create JFrame
        JFrame _frame = new JFrame();
    
        JPanel conPanel = new JPanel(new BorderLayout());
    
        // create Mainpanel
        JPanel _mainPanel = new JPanel() {
            @Override
            public String toString() {
                return "All";
            }
        };
    
        // create Layout
        GridLayout _layout = new GridLayout(3, 3, 3, 3);
    
        // set gridlayout to mainpanel
        _mainPanel.setLayout(_layout);
    
        JComboBox<JPanel> combo = new JComboBox<>();
    
        combo.addItem(_mainPanel);
    
        for (int i = 0; i < 12; i++) {
            final int fi = i;
            JPanel _tempPanel = new JPanel() {
                @Override
                public String toString() {
                    return "Panel" + fi;
                }
    
                @Override
                protected void paintComponent(Graphics g) {
                    super.paintComponent(g);
                    g.drawString(toString(), 5, 15);
                }
    
            };
            _tempPanel.setBackground(Color.ORANGE);
            _tempPanel.setBorder(BorderFactory.createLineBorder(Color.black));
    
            _mainPanel.add(_tempPanel);
    
            combo.addItem(_tempPanel);
    
        }
    
        combo.addActionListener( e -> {
    
            JPanel panel = (JPanel)combo.getSelectedItem();
    
            conPanel.remove(_mainPanel);
            _mainPanel.removeAll();
    
            for(int i = 1; i < combo.getItemCount(); i++)
                _mainPanel.add(combo.getItemAt(i));
    
            conPanel.add(panel, BorderLayout.CENTER);
    
            conPanel.revalidate();
    
            conPanel.repaint();
    
        } );
    
        conPanel.add(_mainPanel, BorderLayout.CENTER);
    
        JPanel buttonsPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
    
        buttonsPanel.add(combo);
    
        conPanel.add(buttonsPanel, BorderLayout.SOUTH);
    
        // add mainpanel to frame
        _frame.setContentPane(conPanel);
    
        _frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // set size of Jframe
        _frame.setSize(1000, 1000);
        _frame.setVisible(true);
    
    }