始终使聚焦的 JPanel 居中

Always center the focused JPanel

我有一个项目,我总是希望将聚焦的 JPanel 居中。所以我想我可以改变视口位置。但是我不能使用视口。我创建了一个示例项目来展示我如何使用视口。我只想让用户只看到其中一个橙色框。但也应该可以一次查看所有框。所以视图必须放大或类似的东西。我该如何解决这个问题? 我的例子:

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);
    }
}

JViewPort 无法满足您的要求。 这是一段丑陋但 运行 的代码。你可以自己改进。

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);

}