JPanel和JFrame的大小不同

时间:2014-08-05 17:40:19

标签: java swing jframe jpanel

在下面的代码中,我创建了JFrame,将尺寸设置为800 x 800像素,将布局设置为BorderLayout,然后添加JPanel

JPanel中,我使用paintComponent在7个位置绘制20x20像素的图像。 在0-0位置,图标出现在右上角。

图标高20像素,框架和面板均为800像素高,因此在x-780处绘制图标时,应将图标与窗口底部对齐。但是icond甚至没有出现。

其余图标绘制为x-770,x-760,x-758和x-750。 x-758看起来与窗口底部对齐。因此,我得出结论JPanel上的{[0]}从JFrame的x [42]

开始

我认为我已正确设置了BorderLayout。我会在setSize()的构造函数中调用JPanel。我认为设置一个明确的大小可能搞砸了。但在评论该线后,该程序显示相同的行为。

你能告诉我我做错了吗?

Frametest.java

package frametest;
import java.awt.BorderLayout;
import javax.swing.JFrame;

public class FrameTest extends JFrame{
    public static final int HEIGHT = 800;
    public static final int WIDTH = 800;

    public FrameTest(){
        setLayout(new BorderLayout());
        add(new Panel(WIDTH, HEIGHT), BorderLayout.CENTER);
        pack();
        setTitle("Frame Test");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(WIDTH, HEIGHT);
        setResizable(false);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        new FrameTest();
    }
}

Panel.java

package frametest;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class Panel extends JPanel{
    private int height;
    private int width;
    Image icon1 = new ImageIcon(this.getClass().getResource("icon1.png")).getImage();     //Note that the png file is 20 x 20 pixels.   

    public Panel(int width, int hieght){
        setBackground(Color.BLUE);
        //setSize(width, hieght);
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawImage(icon1, 0, 0, this);   //appears in the upper-right corner
        g2d.drawImage(icon1, 20, 780, this);  //does not appear
        g2d.drawImage(icon1, 40, 770, this);  //appears with bottom pixels cut off
        g2d.drawImage(icon1, 70, 760, this);  //appears with the bottom pixels cut off
        g2d.drawImage(icon1, 100, 758, this);  //appears aligned with bottom of the window
        g2d.drawImage(icon1, 130, 750, this);  //appears slightly above the bottom of the window
        g2d.drawImage(icon1, 780, 20, this);  //appears aligned with the right side of the screen.
    }
}

3 个答案:

答案 0 :(得分:1)

  • 根据组件的首选尺寸,使用frame.pack()(正如您已使用的那样)代替符合组件的frame.setSize()。只需删除setSize()来电。

  • 在自定义绘画的情况下,覆盖getPreferredSize()以设置JPanel的首选大小。

示例代码:

class Panel extends JPanel {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        ...
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(..., ...);
    }
}

答案 1 :(得分:1)

听起来问题是因为JFrame周围的边框。像顶部菜单栏这样的东西会从可用空间中占用一些空间来显示JFrame中的内容。

尝试将getPreferredSize()添加到您的JPanel,并在您的JFrame上调用pack()

答案 2 :(得分:1)

您正在设置JFrame的大小。这包括框架装饰,菜单栏(如果有的话),等等。如果您希望您的JPanel具有尺寸800 x 800,请设置JPanel的首选尺寸并使用JFrame.pack()

为此,请从Frametest.java中删除以下行:

setSize(WIDTH, HEIGHT);

然后,在Panel.java中,从

更改此行
//setSize(width, hieght);

为:

setPreferredSize(new Dimension(800, 800));

除此之外,您还可以覆盖getPreferredSize()

public Dimension getPreferredSize ()
{
    return new Dimension(800, 800);
}