如何在JFrame中正确居中JPanel(FIXED SIZE)?

时间:2011-08-28 20:00:29

标签: java swing gridbaglayout

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

  1. JPanel 必须在JFrame中居中。

  2. JPanel 必须 始终指定的尺寸< setPreferredSize()方法。它不能在这个尺寸下调整大小。

  3. 我尝试使用GridBagLayout:它是 ONLY 的方式我可以做到。

    请参阅以下示例:

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

    Here截图:

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

    示例代码:

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

    Here截图,

    有什么想法吗?谢谢大家: - )

6 个答案:

答案 0 :(得分:15)

BoxLayout可以保存你的setXxxSize(),然后只需添加panel.setMaximumSize(new Dimension(100, 100));

,你的输出将是

由setMinimumSize删除请注意,如果Container的尺寸更大,则为...)

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

答案 1 :(得分:5)

首先,感谢所有人。

我在另一个时间回答我自己的问题,向大家展示我做出的选择。 请参阅下面的示例代码; 如您所见,我只包含了实现目标绝对必要的最小步骤。

/* 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您可以看到截图。

问题解决了。 非常感谢所有人。

IT

答案 2 :(得分:2)

按名称创建一个面板&#34; FixedPanel&#34;使用GridBagLayout并将首选大小设置为帧大小 然后将您的框架添加到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);  

答案 3 :(得分:-1)

你可以这样做。我不得不做一个象棋游戏,我希望棋子片总是放在一个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();
        }
    }
}

答案 4 :(得分:-2)

它刚刚拥有

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

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

答案 5 :(得分:-5)

使用

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

代替?