IT.*_*IT. 16 java swing gridbaglayout
大家好!我正在尝试解决一个很明显的问题,但我无法解决它.我正在使用Java/Swing库开发示例应用程序; 我有一个JFrame和一个JPanel.我只想达到以下目标:
JPanel 必须在JFrame内部居中.
的JPanel 必须有ALWAYS一个与指定的大小
有必要对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);
    }
}
Run Code Online (Sandbox Code Playgroud)
这是一个截图:
我不会使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)
这是一个截图,
有任何想法吗?谢谢大家 :-)
mKo*_*bel 15
BoxLayout可以很好地保存你的setXxxSize(),然后只需添加panel.setMaximumSize(new Dimension(100, 100));
你的输出就是
由setMinimumSize删除(如果Container的大小更大,则注意...)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)
        首先,感谢大家.
我又回答了我自己的问题,向大家展示了我的选择.请参阅下面的示例代码; 如您所见,我只包含了实现目标绝对必要的最小步骤.
/* 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);
    }
}
Run Code Online (Sandbox Code Playgroud)
在这里你可以看到截图.
问题解决了.非常感谢所有人.
它