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

daG*_*vis 16 java swing fixed-width

我正在使用Java开发Snake游戏.Board(所有动作都取而代之)宽度和高度应固定(640像素×480像素).

结构体:

  • JFrame类扩展的类,
  • JPanel类扩展的Board类;

类我有类似...

setSize( 1024, 768 );
Run Code Online (Sandbox Code Playgroud)

......在董事会上我有...

setSize( BOARDS_WIDTH, BOARDS_HEIGHT );
Run Code Online (Sandbox Code Playgroud)

问题是主要和唯一的窗口似乎像1024*768,但它内部的面板 - 不像640*480.我也有setBackground(),背景填充超过640*480.

有没有办法让Board的宽度和高度像640*480,但主窗口的宽度和高度 - 和Board的宽度和高度一样正确吗?

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

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

编辑:

所有作品......差不多.

主要课程:

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

董事会类:

setPreferredSize( new Dimension( 640, 480 ) );
Run Code Online (Sandbox Code Playgroud)

灰色背景是642*482!就像会有一个像素包围所有边界!

mKo*_*bel 11

请问,有些东西是x x x*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]
Run Code Online (Sandbox Code Playgroud)

代码(来自Trail的基本内容:使用JFC/Swing创建GUI,但我仍然认为这会过时)

编辑:忘了 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();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)


mKo*_*bel 7

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);
Run Code Online (Sandbox Code Playgroud)

  • -1答案应该促进适当的Java命名约定.变量名称不应以大写字符开头. (6认同)
  • 是的,+ 1,但我没有使用过setLocations - 也许这是一个错字.在调用pack以使GUI居中后,我有时也会调用setLocationRelativeTo(null). (2认同)
  • @ camickr +1正确的建议,但它是故意的,我只是遵循@ daGrevis的ClassNames (2认同)