How can I properly center a JPanel ( FIXED SIZE ) inside a JFrame?

前端 未结 6 1991
死守一世寂寞
死守一世寂寞 2020-12-03 03:27

Hi all! I\'m trying to solve an -apparently- simple problem, but I cannot fix it. I\'m working on a sample application with Java/Swing libraries; I have a JFrame and a JPan

相关标签:
6条回答
  • 2020-12-03 03:50

    First of all, thanks to all.

    I reply another time to my own question, to show everyone the choice I have made. See the sample code below; As you can see, I have included only minimal steps which are absolutely necessary to achieve the goal.

    /* file StackResponse.java */
    
    import java.awt.*;
    import javax.swing.*;
    
    public class StackResponse {
        public static void main(String [] args) {
    
            JPanel panel = new JPanel();
            Dimension expectedDimension = new Dimension(100, 100);
    
            panel.setPreferredSize(expectedDimension);
            panel.setMaximumSize(expectedDimension);
            panel.setMinimumSize(expectedDimension);
    
            panel.setBackground(Color.RED); // for debug only
    
            Box box = new Box(BoxLayout.Y_AXIS);
    
            box.add(Box.createVerticalGlue());
            box.add(panel);     
            box.add(Box.createVerticalGlue());
    
            JFrame frame = new JFrame();
            frame.add(box);
            frame.setSize(new Dimension(200, 200));
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            frame.setMinimumSize(frame.getMinimumSize());   // cannot be resized-
    
            frame.setVisible(true);
    
        }
    }
    

    Here you can see a screenshot.

    Problem solved. Many thanks again to all.

    IT

    0 讨论(0)
  • 2020-12-03 03:53

    use

    panel.setMaximumSize(new Dimension(200,200));
    panel.setResizable(false)
    

    instead?

    0 讨论(0)
  • 2020-12-03 03:55

    create a panel by name "FixedPanel" with GridBagLayout and set preferred size to frame size then add your frame into FixedPanel.

    Frame = new JFrame("CenterFrame");         
    Frame.setLocation(0, 0);
    Frame.setSize(new Dimension(400,400));//dim
    
    JPanel FixedPanel = new JPanel(new GridBagLayout());
    FixedPanel.setPreferredSize(Frame.getSize());
    
    JPanel myPanel = new JPanel();
    myPanel.setPreferredSize(new Dimension(100,100));
    myPanel.setBackground(Color.BLACK);
    
    FixedPanel.add(myPanel);
    Frame.add(FixedPanel);
    Frame.setVisible(true);  
    
    0 讨论(0)
  • 2020-12-03 03:55

    You can do this. I had to make a chess game, and I wanted the chess piece piece to always go in the center of a cell which was a JlayeredPane:

    private void formMouseReleased(java.awt.event.MouseEvent evt) {
        // TODO add your handling code here:
        if (jl != null)
        {
            jl.setLocation(evt.getX()+10, evt.getY()+10);
            Component com = findComponentAt(evt.getPoint());
            if (com instanceof JPanel)
            {
                // System.out.println("Yes, it's a jpanel");
                ((JPanel)com).add(jl);
                ((JPanel)com).validate();
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-03 04:13

    Its Just Having

    jPanel.setBounds(x, y, 1046, 503);

    Where x is space for right side and y is space for left side. you have to calculate the space from both side according to screen height and width

    0 讨论(0)
  • 2020-12-03 04:15

    BoxLayout can pretty to hold your setXxxSize(), then just add panel.setMaximumSize(new Dimension(100, 100));

    and your output would be

    Removed by setMinimumSize(notice if Container has greater size as ... )

    enter image description here enter image description here enter image description here

    import java.awt.*;
    import javax.swing.*;
    
    public class CustomComponent12 extends JFrame {
    
        private static final long serialVersionUID = 1L;
    
        public CustomComponent12() {
            Box box = new Box(BoxLayout.Y_AXIS);
            box.setAlignmentX(JComponent.CENTER_ALIGNMENT);
            box.add(Box.createVerticalGlue());
            box.add(new CustomComponents12());
            box.add(Box.createVerticalGlue());
            add(box);
            pack();
            setTitle("Custom Component Test / BoxLayout");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setMaximumSize(getMinimumSize());
            setMinimumSize(getMinimumSize());
            setPreferredSize(getPreferredSize());
            setLocation(150, 150);
            setVisible(true);
        }
    
        public static void main(String[] args) {
            Runnable r = new Runnable() {
    
                @Override
                public void run() {
                    CustomComponent12 main = new CustomComponent12();
                }
            };
            javax.swing.SwingUtilities.invokeLater(r);
        }
    }
    
    class CustomComponents12 extends JPanel {
    
        private static final long serialVersionUID = 1L;
    
        @Override
        public Dimension getMinimumSize() {
            return new Dimension(100, 100);
        }
    
        @Override
        public Dimension getMaximumSize() {
            return new Dimension(100, 100);
        }
    
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(100, 100);
        }
    
        @Override
        public void paintComponent(Graphics g) {
            int margin = 10;
            Dimension dim = getSize();
            super.paintComponent(g);
            g.setColor(Color.red);
            g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
        }
    }
    
    0 讨论(0)
提交回复
热议问题