在JFrame中对齐主动呈现的JPanel

时间:2011-10-28 03:26:13

标签: java rendering jframe jpanel bufferedimage

有人可以解释为什么pack()不能使用这个JFrame吗?

里面有一个JPanel(实际上是一个扩展JPanel的类 - inner)。

这是我正在使用的代码:

inner.setPreferredSize(new Dimension(800, 600));
add(inner);
pack();
setResizable(false);
setLocationRelativeTo(null); // to center the JFrame on screen
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);

额外空间似乎是JFrame装饰的确切宽度和高度(即JFrame的尺寸减去JPanel的尺寸)。

enter image description here

2 个答案:

答案 0 :(得分:3)

setResizable(false)之前调用pack() 。 “额外空间似乎是JFrame装饰的确切宽度和高度并非巧合。”

附录:这是sscce,显示我的初步猜测不正确。

enter image description here

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;

/** @see http://stackoverflow.com/questions/7924830 */
public class NonResizable extends JPanel {

    public NonResizable() {
        this.setPreferredSize(new Dimension(400, 300));
        this.setBackground(Color.lightGray);
        this.setBorder(BorderFactory.createLineBorder(Color.blue));
    }

    private void display() {
        JFrame f = new JFrame("NonResizable");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLayout(new FlowLayout());
        f.setBackground(Color.white);
        f.add(this);
        f.pack();
        f.setResizable(false);
        f.setLocationRelativeTo(null);
        f.setSize(500, 400);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new NonResizable().display();
            }
        });
    }
}

答案 1 :(得分:0)

原来我是从JFrame而不是JPanel绘制(主动渲染)...所以额外的空间是JPanel的draw()对象在0,0(在JFrame中)对齐的结果。

this post解决。