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

问题描述 投票:0回答:2

我正在使用 Java 开发贪吃蛇游戏。棋盘(所有动作发生的地方)的宽度和高度应该是固定的(640 像素 * 480 像素)。

结构:

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

Main课程中,我有类似...

setSize( 1024, 768 );

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

setSize( BOARDS_WIDTH, BOARDS_HEIGHT );

问题是主窗口和唯一窗口似乎是 1024 * 768,但其中的面板 - 不像 640 * 480。我也有 setBackground() 并且背景填充超过 640 * 480。

有什么方法可以使 Board 的宽度和高度像 640 * 480 一样,但主窗口的宽度和高度 - 只要 Board 的宽度和高度是正确的?

现在看起来像这样...

Width and height are ~1000 * ~750, not 640 * 480.

编辑:

一切正常......几乎。

主要类:

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

类:

setPreferredSize( new Dimension( 640, 480 ) );

灰色背景是642*482!就像会有一个边框将所有内容包围 1 个像素!

java swing fixed-width
2个回答
16
投票

拜托,发生了 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:使用 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(); } }); } }
    

9
投票
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);
    
© www.soinside.com 2019 - 2024. All rights reserved.