Arindam Arindam - 22 days ago 5
Java Question

JAVA Set Maximum Size of JFrame

I'm working on a project on JAVA Swing. I don't have much experience in JAVA, and I need some help from you guys.
I'm using

frame.pack()
so it takes the optimal size as required. My
screenTwo
can change depending on the input from
ScreenOne
. I've used
frame.setMaximumSize(new Dimension(1300, 500))
but it doesn't seem to be working.
If the frame gets bigger, it overlaps with the Taskbar, and I don't want that, so it should be a bit smaller than the total Screen size. How to achieve this?

EDIT:

Code:

public class Test {

private static JFrame frame ;
private JRadioButton[] radioButton;
public static void main(String[] args) {
Test t = new Test();
t.go();
frame.pack();
frame.setMaximumSize(new Dimension(1300, 600));
frame.setResizable(false);
frame.setVisible(true);
Dimension si = frame.getContentPane().getSize();
System.out.println(si); //Output: java.awt.Dimension[width=934,height=751]
}
public void go()
{
frame = new JFrame();
JPanel panel1 = new JPanel();
frame.getContentPane().add(panel1);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel1.setLayout(new BorderLayout(0, 20));
Font font = new Font("Times New Roman", Font.PLAIN, 20);

JPanel panel2 = new JPanel();
panel2.setLayout(new FlowLayout(FlowLayout.CENTER, 50, 1));
panel2.add(new JLabel(" Flight ID"));
panel2.add(new JLabel(" Departure"));
panel2.add(new JLabel(" Arrival "));
panel2.add(new JLabel(" Transit Time "));
panel2.add(new JLabel("Total Duration "));
panel1.add(BorderLayout.NORTH, panel2);

JPanel panel3 = new JPanel();
panel3.setLayout(new GridLayout(0, 1));

GridBagConstraints c = new GridBagConstraints();
int comboSize = 15, i;
JPanel panelCombo[] = new JPanel[comboSize];
ButtonGroup group = new ButtonGroup();
radioButton = new JRadioButton[comboSize];
/***
Adding a bunch of components in here
***/
for(i=0; i<comboSize; i++) {
panelCombo[i] = new JPanel();
panelCombo[i].setLayout(new GridBagLayout());
c.gridx = 0;
c.gridy = 0;
c.insets = new Insets(0, 50, 0, 50);
panelCombo[i].add(new JLabel("Flight 1 ID"), c);

c.gridx++;
panelCombo[i].add(new JLabel("Dept Time"), c);

c.gridx++;
panelCombo[i].add(new JLabel("Arr Time"), c);
c.gridx++;
c.gridheight = 4;
panelCombo[i].add(new JLabel("Total time"), c);
c.gridx++;

panelCombo[i].add(new JLabel("Duration"), c);

c.gridx++;
radioButton[i] = new JRadioButton();
panelCombo[i].add(radioButton[i], c);
group.add(radioButton[i]);

c.gridheight = 1;
c.gridx = 0;
c.gridy++;
panelCombo[i].add(new JLabel("Depar to Arrival"), c);

c.gridx++;
panelCombo[i].add(new JLabel("Date"), c);

c.gridx = 0;
c.gridy++;
panelCombo[i].add(new JLabel("Flight 2 ID"), c);

c.gridx++;
panelCombo[i].add(new JLabel("Dept Time"), c);

c.gridx++;
panelCombo[i].add(new JLabel("Arr Time"), c);

c.gridx = 0;
c.gridy++;
panelCombo[i].add(new JLabel("Dept to Arrival"), c);

c.gridx++;
panelCombo[i].add(new JLabel("Date"), c);
panelCombo[i].setBackground(Color.GREEN);

panel3.add(panelCombo[i]);
panelCombo[i].setBorder(BorderFactory.createLineBorder(Color.BLACK));
}
JScrollPane scroll = new JScrollPane(panel3);
scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
panel1.add(BorderLayout.CENTER, scroll);


}
}

Answer

First of all, what's with all the code you posted?. Your question is about the preferred and maximum size of a frame. The layout of the frame is irrelevant to the question.

We are not interested in your application. We are only interested in code that demonstrates the problem.

For example:

JPanel panel = new JPanel();
panel.setPreferredSize( new Dimension(1400, 600) );

JFrame frame = new JFrame();
frame.add( panel );
frame.pack();
frame.setMaximumSize( new Dimension(1300, 500) );
frame.setVisible( true );

Now you put the above code in a main() method and you have code that demonstrates your problem. THAT is what you post in the forum, not a core dump of your application.

If the frame gets bigger, it overlaps with the Taskbar, and I don't want that,

Regarding your issue you can use the following code to get the space available on the desktop:

GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
Rectangle bounds = env.getMaximumWindowBounds();
System.out.println("Screen Bounds: " + bounds );

Add the above code after the pack() and then add something like the following:

int width = Math.min(frame.getWidth(), bounds.width);
int height = Math.min(frame.getHeight(), bounds.height);
frame.setSize( new Dimension(width, height) );
frame.setVisible(true);
Comments