JFrame resize problem

I am creating the function when the user resizes the JFrame, I would like the few components to auto-locate to fit the size.

Well, it works fine the first time the user resized the JFrame, it fit correctly. However, the second time they resized the JFrame, seems like all the components get back to the original width and height again (before my 1st resize) so my 2nd resize becomes inaccurate.

I used NetBeans and my codes look like below.

    private void formComponentResized(java.awt.event.ComponentEvent evt) {                                      
        int newHeight = evt.getComponent().getHeight();
        int newWidth = evt.getComponent().getWidth();
       
        int diffHeight = newHeight - originalHeight;
        int diffWidth = newWidth - originalWidth;
       
        System.out.println("jPanel1.getHeight() = " + jPanel1.getHeight());

        if (diffHeight >= 0) {
            jPanel1.setBounds(jPanel1.getX(), jPanel1.getY(), jPanel1.getWidth(), jPanel1.getHeight() + diffHeight);            
        }
        else {            
            jPanel1.setBounds(jPanel1.getX(), jPanel1.getY(), jPanel1.getWidth(), jPanel1.getHeight() - diffHeight);            
        }

        if (diffWidth >= 0) {
            jPanel1.setBounds(jPanel1.getX(), jPanel1.getY(), jPanel1.getWidth() + diffWidth, jPanel1.getHeight());
        }
        else {
            jPanel1.setBounds(jPanel1.getX(), jPanel1.getY(), jPanel1.getWidth() - diffWidth, jPanel1.getHeight());
        }
       
        System.out.println("jPanel1.getHeight() 2 = " + jPanel1.getHeight());
        originalHeight = newHeight;
        originalWidth = newWidth;
    }    

My output is
jPanel1.getHeight() = 550
jPanel1.getHeight() 2 = 750 (CORRECT UP TO HERE)
when I did my 2nd resize....
jPanel1.getHeight() = 550 (it is back to original height)
jPanel1.getHeight() 2 = 642

Any idea?
LVL 16
suprapto45Asked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

suprapto45Author Commented:
Might be a silly thing but I could not figure out what did I miss ;)
0
zzynxSoftware engineerCommented:
>> I would like the few components to auto-locate to fit the size.
Isn't that what a layout manager (automatically) takes care of?
0
suprapto45Author Commented:
Yep,

However, I think it uses either Null layout or AbsoluteLayout (from NetBeans). I think that this layout would not be able to control those auto-resize.

Am I right?

Thanks
David
0
Exploring SQL Server 2016: Fundamentals

Learn the fundamentals of Microsoft SQL Server, a relational database management system that stores and retrieves data when requested by other software applications.

suprapto45Author Commented:
I fixed the bugs.

        if (diffHeight >= 0) {
            jPanel1.setBounds(jPanel1.getX(), jPanel1.getY(), jPanel1.getWidth(), jPanel1.getHeight() + diffHeight);            
        }
        else {            
            jPanel1.setBounds(jPanel1.getX(), jPanel1.getY(), jPanel1.getWidth(), jPanel1.getHeight() - diffHeight);            
        }

If I resize the form and the diffHeight becomes -100 (for example), then

        else {            
            jPanel1.setBounds(jPanel1.getX(), jPanel1.getY(), jPanel1.getWidth(), jPanel1.getHeight() - diffHeight);            
        }

will be inaccurate. It becomes  jPanel1.getHeight() - (-100) and in the end, it is  jPanel1.getHeight() + 100.

I solved the problem using
        else {            
            jPanel1.setBounds(jPanel1.getX(), jPanel1.getY(), jPanel1.getWidth(), jPanel1.getHeight() - Math.abs(diffHeight));            
        }
0
suprapto45Author Commented:
Thanks zzynx for replying anyway.

That is my mistake.

David
0
zzynxSoftware engineerCommented:
>> Null layout or AbsoluteLayout.
>> I think that this layout would not be able to control those auto-resize
That's right

>> Thanks zzynx for replying anyway.
You're welcome

>> I solved the problem
>> That is my mistake.
So, no more questions left?

0
suprapto45Author Commented:
>>"So, no more questions left?"
Yes :). No more. I think that I am going to delete this question.

Any objection?

Thanks
David
0
zzynxSoftware engineerCommented:
OK for me.
0
suprapto45Author Commented:
Hi zzynx,

Instead of deleting the question, I have another question. Well, out of curiosity, I tried to use BorderLayout with expectation that it will automatically help me to do it.

However, I put my JScrollPane with JTable inside it on the BorderLayout.CENTER and the button on the BorderLayout.SOUTH. However, upon resizing my frame, my JScrollPane do not grow automatically, instead it keeps its current size.

What can I do to make the JScrollPane to resize itself once I resize my JFrame?

Thanks
David
0
suprapto45Author Commented:
And please bare with me as SWING (J2SE) is not my expertise ;)

David
0
zzynxSoftware engineerCommented:
>> my JScrollPane do not grow automatically
It simply should!

You probably apply setPreferredSize() or something like that on your scrollpane/JTable.
You shouldn't do that if you give the layouting in hands of a layout manager.
So remove all kind of setSize(), setPreferredSize(), .... calls.
0
suprapto45Author Commented:
Ok,

Give me a sec....
0
suprapto45Author Commented:
It still does not work. For example, when I tried to maximize the JFrame, the JScrollPane is not growing to fill up the empty space.

    private void initComponents() {
        jPanel1 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        tblAllBand = new javax.swing.JTable();
        ts.setTableHeader(tblAllBand.getTableHeader());
        jPanel2 = new javax.swing.JPanel();
        cmdBack = new javax.swing.JButton();
        btnEdit = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("View All Bands");
        jPanel1.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));

        tblAllBand.setModel(ts);
        tblAllBand.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
        jScrollPane1.setViewportView(tblAllBand);

        jPanel1.add(jScrollPane1);

        getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);

        jPanel2.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.RIGHT));

        cmdBack.setFont(new java.awt.Font("Arial", 0, 12));
        cmdBack.setText("Back");
        cmdBack.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmdBackActionPerformed(evt);
            }
        });

        jPanel2.add(cmdBack);

        btnEdit.setFont(new java.awt.Font("Arial", 0, 12));
        btnEdit.setText("Edit");
        btnEdit.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnEditActionPerformed(evt);
            }
        });

        jPanel2.add(btnEdit);

        getContentPane().add(jPanel2, java.awt.BorderLayout.SOUTH);

        pack();
}

I could not find any setPreferredSize() or setSize().

Let me keep looking....please let me know if you find anything suspicious.

Thanks.
David
0
zzynxSoftware engineerCommented:
This is the reason:
>> jPanel1.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT));
>> ...
>> jPanel1.add(jScrollPane1);

Change this to:

jPanel1.setLayout(new java.awt.BorderLayout());
...
jPanel1.add(jScrollPane1, java.awt.BorderLayout.CENTER);
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
zzynxSoftware engineerCommented:
So, your jPanel1 didn't have the BorderLayout but the FlowLayout.
In that case the behaviour you experienced was normal.
0
suprapto45Author Commented:
You know what zzynx,

That works like a charm. You deserve more points. I should learn this SWING more ;).

Thanks again. Really appreciate it.
David
0
zzynxSoftware engineerCommented:
>> That works like a charm.
:°)

>> You deserve more points.
Well, thanks

>> I should learn this SWING more ;)
Yeah. Once you know it good, it's not that hard anymore.

>> Thanks again. Really appreciate it.
You're welcome. Glad to help.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Java

From novice to tech pro — start learning today.