Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

setPreferredSize does not work

Code:

import java.awt.Dimension;

import javax.swing.*;

public class Game extends JFrame {
    private static final long serialVersionUID = -7919358146481096788L;
    JPanel a = new JPanel();
    public static void main(String[] args) {
        new Game();
    }
    private Game() {
        setTitle("Insert name of game here");
        setLocationRelativeTo(null);
        setLayout(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        a.setPreferredSize(new Dimension(600, 600));
        add(a);
        pack();
        setVisible(true);
    }
}

So I set the preferred size of the JPanel to 600 by 600 and pack the frame, but the frame's size is still 0 by 0.

Why is this and how do I fix it?

like image 451
tckmn Avatar asked Aug 13 '12 17:08

tckmn


2 Answers

As you said, pack() will try and arrange the window so that every component is resized to its preferredSize.

The problem is that it seems that the layout manager is the one trying to arrange the components and their respective preferredSizes. However, as you set the layout manager as being null, there is no one in charge of that.

Try commenting the setLayout(null) line, and you're gonna see the result. Of course, for a complete window, you're going to have to choose and set a meaningful LayoutManager.

This works fine to me:

import java.awt.Dimension;

import javax.swing.*;

public class Game extends JFrame {
    private static final long serialVersionUID = -7919358146481096788L;
    JPanel a = new JPanel();
    public static void main(String[] args) {
        new Game();
    }
    private Game() {
        setTitle("Insert name of game here");
        setLocationRelativeTo(null);
        //setLayout(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        a.setPreferredSize(new Dimension(600, 600));
        add(a);
        pack();
        setVisible(true);
    }
}
like image 138
Filipe Fedalto Avatar answered Sep 21 '22 23:09

Filipe Fedalto


pack() queries the preferred size of the parent container over that of the child so you would have to use:

setPreferredSize(new Dimension(600, 600));

Another note is to call

setLocationRelativeTo(null);

after pack() has been called to calculate center coordinates :)

OK, just spotted the null layout there, why not use the default BorderLayout of JFrame?

like image 25
Reimeus Avatar answered Sep 21 '22 23:09

Reimeus