Java 在JFrame内对齐活动渲染的JPanel

Java 在JFrame内对齐活动渲染的JPanel,java,rendering,jframe,jpanel,bufferedimage,Java,Rendering,Jframe,Jpanel,Bufferedimage,有人能解释为什么pack()不能在这个JFrame上工作吗 它内部有一个JPanel(实际上,是一个扩展JPanel-内部的类) 以下是我使用的代码: inner.setPreferredSize(new Dimension(800, 600)); add(inner); pack(); setResizable(false); setLocationRelativeTo(null); // to center the JFrame on screen setDefaultCloseOperat

有人能解释为什么pack()不能在这个JFrame上工作吗

它内部有一个JPanel(实际上,是一个扩展JPanel-
内部的类)

以下是我使用的代码:

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的尺寸)

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

附录:这表明我最初的猜测是错误的

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

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

附录:这表明我最初的猜测是错误的

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

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

解决方法。

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


解决方法。

额外的空间在JFrame的底部和右侧以灰色显示。如果对比度太低,我可以发布另一张图像。您是否尝试切换
设置未装饰(布尔v)
?我希望保留装饰。但是,如果你好奇,未修饰的窗口的大小更准确(尽管奇怪的是,根据我的测量,只有几个像素)。“我可以发布另一个图像。”在你考虑之前,请检查提示,特别是关于“ALT+PrimT屏蔽”和400 X300的建议,当它显示效果时!AndrewThompson我发布的截图有什么问题吗?额外的空间在JFrame的底部和右侧以灰色显示。如果对比度太低,我可以发布另一张图像。您是否尝试切换
设置未装饰(布尔v)
?我希望保留装饰。但是,如果你好奇,未修饰的窗口的大小更准确(尽管奇怪的是,根据我的测量,只有几个像素)。“我可以发布另一个图像。”在你考虑之前,请检查提示,特别是关于“ALT+PrimT屏蔽”和400 X300的建议,当它显示效果时!AndrewThompson我发布的截图有什么问题吗?如果没有帮助,请提供一个显示您描述的问题的示例。它删除了部分空间,但不是全部空间。我将致力于建立一个sscce。我最初的猜测是错误的;我在上面添加了一个示例。如果这没有帮助,请提供一个演示您描述的问题的示例。它删除了部分空间,但不是全部空间。我将致力于建立一个sscce。我最初的猜测是错误的;我在上面添加了一个示例。