package data;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends JFrame implements Runnable {

    private JPanel contentPane;
    private JPanel pp = new JPanel();

    Thread page = new Thread();

    public void run() {
        while (!Thread.interrupted()) {

        }
    }

    public Main() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 640 + 16, 480 + 39);
        contentPane = new JPanel();
        contentPane.setBounds(0, 0, 640, 480);
        contentPane.setLayout(null);
        setContentPane(contentPane);

        pp.setBounds(0, 0, 640, 480);
        pp.setBackground(Color.BLACK);
        contentPane.add(pp);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Main frame = new Main();
                    frame.setVisible(true);
                    frame.setResizable(false);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

}


上面的代码可以工作,但是setResizable会引起问题:http://i.stack.imgur.com/hQxPU.png

如果要删除setResizable,则底部和右侧的灰色将变成黑色,这是本应如此的。如何禁用大小调整而不会导致此问题?

最佳答案

您使用的是绝对布局(未设置LayoutManager),并且黑色面板具有固定的边界。这正是调整父面板大小时黑色面板不会填充其父面板边界的原因。

解决方案:使用LayoutManager会自动重新计算内容的范围,以填充可用空间。

   // BorderLayout is your friend
   contentPane.setLayout(new BorderLayout());
   ...
   // delete this line, no need to set fixed bounds
   // pp.setBounds(0, 0, 640, 480);


有关如何在AWT / Swing中使用布局管理器的更多信息:
The Java™ Tutorials - Using Layout Managers

布局管理器有两个目的:


计算容器的最小/最大/首选尺寸
通过在容器内设置其边界来布局组件。


如果希望黑色面板的大小为640x480,并且窗口不可调整大小,则可以设置首选大小,然后打包该窗口,以使其大小适合内容的首选大小:

pp.setPreferredSize(new Dimension(640, 480));
...
pack();

10-07 22:54