javaswingfixed-width

How to Set JPanel's Width and Height?


I'm developing Snake game using Java. Board's (where all action takes it place) width and height should be fixed (640 pixels * 480 pixels).

Structure:

In Main class I have something like...

setSize( 1024, 768 );

...and in Board class I have...

setSize( BOARDS_WIDTH, BOARDS_HEIGHT );

Problem is that main and only windows seems to be like 1024 * 768, but panel inside it - not like 640 * 480. I have setBackground() as well and background is filled more than 640 * 480.

Is there any way to make Board's width and height like 640 * 480, but main windows width and height - as much as Board's width and height are correct?

Right now it looks like this...

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

Edit:

All works... almost.

Main class:

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

Board class:

setPreferredSize( new Dimension( 640, 480 ) );

Gray background is 642 * 482! Like there would be border that wraps all by 1 pixel!


Solution

  • please, something went xxx*x, and that's not true at all, check that

    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]
    

    code (basic stuff from Trail: Creating a GUI With JFC/Swing , and yet I still satisfied that that would be outdated )

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