Java 如何在JFrame中正确地将JPanel(固定大小)居中?

Java 如何在JFrame中正确地将JPanel(固定大小)居中?,java,swing,gridbaglayout,Java,Swing,Gridbaglayout,大家好! 我试图解决一个看似简单的问题,但我无法解决它。 我正在使用Java/Swing库开发一个示例应用程序; 我有一个JFrame和一个JPanel。 我只想实现以下目标: JPanel必须在JFrame内居中 JPanel必须始终具有指定的大小 setPreferredSize()方法。不得在此大小下调整其大小 我尝试使用GridBagLayout:这是我唯一能做到的方法 请参见下面的示例: /* file StackSample01.java */ import java.awt.*;

大家好! 我试图解决一个看似简单的问题,但我无法解决它。 我正在使用Java/Swing库开发一个示例应用程序; 我有一个JFrame和一个JPanel。 我只想实现以下目标:

  • JPanel必须在JFrame内居中

  • JPanel必须始终具有指定的大小
    setPreferredSize()方法。不得在此大小下调整其大小

  • 我尝试使用GridBagLayout:这是我唯一能做到的方法

    请参见下面的示例:

    /* file StackSample01.java */
    
    import java.awt.*;
    import javax.swing.*;
    
    public class StackSample01 {
        public static void main(String [] args) {
    
            JFrame frame = new JFrame();
            JPanel panel = new JPanel();
            panel.setPreferredSize(new Dimension(100, 100));
            panel.setBackground(Color.RED);  
    
            frame.setLayout(new GridBagLayout());
            frame.add(panel, new GridBagConstraints());
            frame.setSize(new Dimension(200, 200));
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
    
        }
    }
    
    截图:

    我不会用GridBagLayout做太简单的事情。 我尝试了一个最简单的解决方案,使用了一个盒子,但这不起作用:

    示例代码:

    /* file StackSample02.java */
    
    import java.awt.*;
    import javax.swing.*;
    
    public class StackSample02 {
        public static void main(String [] args) {
    
            JFrame frame = new JFrame();
            JPanel panel = new JPanel();
            panel.setPreferredSize(new Dimension(100, 100));
            panel.setBackground(Color.RED); // for debug 
    
            panel.setAlignmentX(JComponent.CENTER_ALIGNMENT); // have no effect
    
            Box box = new Box(BoxLayout.Y_AXIS);
    
            box.add(Box.createVerticalGlue());
            box.add(panel);     
            box.add(Box.createVerticalGlue()); // causes a deformation
    
            frame.add(box);
            frame.setSize(new Dimension(200, 200));
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
    
        }
    }
    
    截图

    有什么想法吗?感谢所有:-)

    使用

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

    可以保存setXxxSize(),然后只需添加
    panel.setMaximumSize(新维度(100100))

    您的输出将是

    由setMinimumSize删除(注意,如果容器的大小大于…)


    首先,感谢大家

    我再次回答自己的问题,向大家展示我所做的选择。 参见下面的示例代码; 正如你所看到的,我只包括了实现目标绝对必要的最小步骤

    /* 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);
    
        }
    }
    
    你可以看到一个截图

    问题解决了。 再次感谢大家


    你可以这样做。我必须下一盘棋,我想让棋子一直放在一个格子的中央,那是一个窗格:

    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();
            }
        }
    }
    
    只是有

    jPanel.setBounds(x,y,1046503)

    其中x为右侧空间,y为左侧空间。 您必须根据屏幕高度和宽度计算两侧的空间

    使用GridBagLayout创建一个名为“FixedPanel”的面板,并将首选大小设置为框架大小 然后将框架添加到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);  
    

    您是否尝试过使用BorderFactory类在“panel”周围放置边框?我对它不太熟悉,否则我会给出一个更具体的例子。“我不会用GridBagLayout做一件太简单的事情。”为什么不呢?我非常讨厌GBL,但在这种情况下,这将是我尝试的第一个布局。@Andrew-full ack,除了使用GBL,永远不会使用它:-)而是选择三大表单之一,Mig,Design,无论什么是个人最喜欢的。@kleopatra you否决了使用setXxxSize()的答案,您是否愿意为我们提供一个正确的答案或一个正确答案的链接?我已经厌倦了阅读你的“-1”作为这个,-1作为那个”评论。@mostruash提示:有一个“频繁”标签。。老实说,我已经厌倦了开发人员不做太多的工作来找到他们问题的答案,或者投票给答案的原因(上升和下降都没有什么区别)-毕竟,找到东西是他们工作的本质。JPanel没有SetResizeable(布尔Resizeable)方法-1对于setXXSize和发明api-你知道如果你不知道,没有义务回答吗?胡乱猜测——这绝对是错误的。@kleopatra有人可以从我的字里行间读到:-),我的好奇心(我们只讨论最深的JC组件,没有孩子)怎么样,或者如果可能的话,resurns可以用另一种方式来设置XXX
    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);