1

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);


    }
}
Arindam
  • 163
  • 1
  • 13
  • Possible duplicate of [setMaximumSize not working in java](http://stackoverflow.com/questions/4061010/setmaximumsize-not-working-in-java) – Eli Sadoff Nov 13 '16 at 19:30
  • Please show the code you are currently trying, otherwise, it's very hard to help – ItamarG3 Nov 13 '16 at 19:31
  • @ItamarGreen Code has been added. Looking forward for any help. – Arindam Nov 13 '16 at 19:45
  • @EliSadoff I've read that one. I even used `frame.setResizable(false)`. It didn't work. – Arindam Nov 13 '16 at 19:46
  • 1
    @Arindam, regarding your just edited code, that is NOT what I suggested. The code that demonstrates the problem should be placed in an actual class with a main() method and everything so that we can copy/compile and execute the code to see if we have the same problem. The code you just posted does not demonstrate any problem because you haven't added any components to the frame and it is not executable.. – camickr Nov 13 '16 at 20:16
  • @camickr I've changed the code. Is this alright? – Arindam Nov 13 '16 at 20:30
  • @Arindam, You didn't even read my answer. I gave your the 7 lines of code that if you add to a main() method will still demonstrate the problem. Your question is about the "preferred" and "maximum" sizes of a frame which can easily be demonstrated without hundred of components being added to the frame. – camickr Nov 13 '16 at 20:55

1 Answers1

5

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);
camickr
  • 321,443
  • 19
  • 166
  • 288
  • I might mention that *In general, using pack is preferable to calling setSize, since pack leaves the frame layout manager in charge of the frame size* (http://stackoverflow.com/questions/22982295/what-does-pack-do). But this is not that relevant in **this** case – ItamarG3 Nov 13 '16 at 20:11