Java setResizable问题

时间:2015-03-17 06:46:20

标签: java swing window-resize

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,那么底部和右边的灰色将是黑色的,就像它的意思一样。如何在不导致此问题的情况下禁用调整大小?

1 个答案:

答案 0 :(得分:3)

您使用的是绝对布局(无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();