如何设置JPanel的宽度和高度?

18

我正在使用Java开发贪吃蛇游戏。 游戏界面的宽度和高度应该是固定的(640像素* 480像素)。

结构:

  • 继承自JFrame类的Main类,
  • 继承自JPanel类的Board类;

Main类中,我有类似以下的代码...

setSize( 1024, 768 );

...而在Board类中,我有...

setSize( BOARDS_WIDTH, BOARDS_HEIGHT );

问题是,主窗口似乎是1024*768,但其中的面板不像640*480。我也使用了setBackground(),而背景填充超过640*480。

有没有办法使“Board”的宽度和高度为640*480,而主窗口的宽度和高度与“Board”的正确宽度和高度相同?

现在它看起来像这样...

宽度和高度约为1000*750,而不是640*480。

编辑:

所有的东西都可以用...... 几乎。

Main类:

add( new Board(), BorderLayout.CENTER );
pack();
setResizable( false );
setLocationRelativeTo( null );
setVisible( true );
setDefaultCloseOperation( EXIT_ON_CLOSE );
setTitle( "Snake (by daGrevis)" );

Board类:

setPreferredSize( new Dimension( 640, 480 ) );

灰色的背景是 642 * 482!就像有一个包裹所有内容的边框一样,边框宽度为1像素!


通常情况下,除非需要添加额外的功能(例如新方法),否则不需要扩展组件。 - Andrew Thompson
会记在我的脑海中。我只是Java的新手! - daGrevis
2
如果您需要超出已经提供的帮助(来自我所认为的“Swing大师”之一),我建议您发布一个SSCCE - Andrew Thompson
2个回答

15

请检查一下,出了点问题,似乎是 xxx*x 导致的,但这并不正确。

JButton Size - java.awt.Dimension[width=400,height=40]
JPanel Size - java.awt.Dimension[width=640,height=480]
JFrame Size - java.awt.Dimension[width=646,height=505]

这里的代码是从Trail: Creating a GUI With JFC/Swing中获取的基础内容,但我仍认为那可能已经过时了。

编辑:不要忘记setDefaultCloseOperation()

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class FrameSize {

    private JFrame frm = new JFrame();
    private JPanel pnl = new JPanel();
    private JButton btn = new JButton("Get ScreenSize for JComponents");

    public FrameSize() {
        btn.setPreferredSize(new Dimension(400, 40));
        btn.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("JButton Size - " + btn.getSize());
                System.out.println("JPanel Size - " + pnl.getSize());
                System.out.println("JFrame Size - " + frm.getSize());
            }
        });
        pnl.setPreferredSize(new Dimension(640, 480));
        pnl.add(btn, BorderLayout.SOUTH);
        frm.add(pnl, BorderLayout.CENTER);
        frm.setLocation(150, 100);
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // EDIT
        frm.setResizable(false);
        frm.pack();
        frm.setVisible(true);
    }

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

            @Override
            public void run() {
                FrameSize fS = new FrameSize();
            }
        });
    }
}

“大问题”是我需要在add()之前调用setResizable(false)! - daGrevis

8
Board.setPreferredSize(new Dimension(x, y));
.
.
//Main.add(Board, BorderLayout.CENTER);
Main.add(Board, BorderLayout.CENTER);
Main.setLocations(x, y);
Main.pack();
Main.setVisible(true);

2
是的,+1,但我没有使用setLocations——也许s是打字错误。有时在调用pack后,我还会调用setLocationRelativeTo(null)来将GUI居中。 - Hovercraft Full Of Eels
我有一个小问题,各位。不能接受这个答案! =D 请看一下我的问题编辑。 - daGrevis
@mKorbel: "我讨厌 :-) setLocationRelativeTo(null) 和 setLocationByPlatform(true)</:-)" 为什么?(我经常使用这两种方法!) - Andrew Thompson
6
答案应促进Java的命名规范。变量名不应以大写字母开头。 - camickr
2
@camickr 给出了正确的建议,但我只是按照 @daGrevis 的 ClassNames 做的。+1 - mKorbel
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接