Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsWhite Papers
Discussion GroupsFirst AidDatabasesJavaBeansGUIJava 3DVirtual MachineCORBASecurityToolsGeneral
Java DirectoryOpen Source ProjectsSample Book ChaptersUser GroupsWeb Resources
Related Topics
Databases.NETMore Topics ...

Java Forum / General / September 2007

Tip: Looking for answers? Try searching our database.

JFrame help please?

Thread view: 
A Watcher - 08 Sep 2007 01:24 GMT
I use the setContentPane method to put a JPanel into a JFrame and then
call validate and repaint.  That works fine.  What I can't do is
change it.  I rerun the setContentPane method with a different JPanel
and do the validate and repaint but nothing happens.  I am using java
5.  Can someone suggest something I could try?

Thanks.
Andrew Thompson - 08 Sep 2007 02:15 GMT
> Can someone suggest something I could try?

Post an SSCCE.

Signature

Andrew Thompson
http://www.athompson.info/andrew/

SadRed - 08 Sep 2007 03:02 GMT
> I use the setContentPane method to put a JPanel into a JFrame and then
> call validate and repaint.  That works fine.  What I can't do is
[quoted text clipped - 3 lines]
>
> Thanks.

Call
       frame.invalidate();
       frame.validate();
A Watcher - 08 Sep 2007 03:23 GMT
>> I use the setContentPane method to put a JPanel into a JFrame and then
>> call validate and repaint.  That works fine.  What I can't do is
[quoted text clipped - 7 lines]
>         frame.invalidate();
>         frame.validate();

Thanks, I'll try that on Monday when I get back to  work.
Knute Johnson - 08 Sep 2007 04:53 GMT
> I use the setContentPane method to put a JPanel into a JFrame and then
> call validate and repaint.  That works fine.  What I can't do is
[quoted text clipped - 3 lines]
>
> Thanks.

There is something interesting happening here.  The test code below
works fine calling setContentPane() from the EDT and following it with
validate().  If I take out the validate() statement it is messed up.  If
I call setContentPane() from the run() off the EDT it works fine.  I
don't think that is safe but it does work (at least it does on my computer).

It is a requirement that the content pane be an opaque component.  I
don't know what will happen if it isn't.

You should also look at JComponent.revalidate().  It schedules
validation of your JComponent's layout.  As it states in the docs, this
is generally not required with JComponents as any size change or layout
modification will call it automatically.

Top level containers that do not extend JComponent do need to have
validate() called when their layout is changed.

If my example here doesn't adequately describe your problem, please post
a test example of your own that shows the problem.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class test6 extends JFrame implements Runnable {
    KPanel[] panels = new KPanel[2];
    int n;

    public test6() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        panels[0] = new KPanel(Color.GREEN);
        panels[1] = new KPanel(Color.BLUE);

        setContentPane(panels[0]);

        setSize(400,300);
        setVisible(true);

        new Thread(this).start();
    }

    public void run() {
        while (true) {
            ++n;
            n %= 2;
            Runnable r = new Runnable() {
                public void run() {
                    setContentPane(panels[n]);
                    validate();
                }
            };
            EventQueue.invokeLater(r);

//            setContentPane(panels[n]);

            try {
                Thread.sleep(2000);
            } catch (InterruptedException ie) { }
        }
    }

    class KPanel extends JPanel {
        final private Color color;

        public KPanel(Color color) {
            this.color = color;

            setLayout(new GridBagLayout());
            GridBagConstraints c = new GridBagConstraints();
            c.gridx = c.gridy = 0;  c.insets = new Insets(2,2,2,2);

            JButton[] b = new JButton[4];
            for (int i=0; i<b.length; i++)
                b[i] = new JButton("Button " + Integer.toString(i+1));

            add(b[0],c);
            ++c.gridx;
            add(b[1],c);
            c.gridx = 0;  ++c.gridy;
            add(b[2],c);
            ++c.gridx;
            add(b[3],c);
        }

        public void paintComponent(Graphics g) {
            g.setColor(color);
            g.fillRect(0,0,getWidth(),getHeight());
        }
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            public void run() {
                new test6();
            }
        };
        EventQueue.invokeLater(r);
    }
}

Signature

Knute Johnson
email s/nospam/knute/

A Watcher - 08 Sep 2007 16:40 GMT
>> I use the setContentPane method to put a JPanel into a JFrame and then
>> call validate and repaint.  That works fine.  What I can't do is
[quoted text clipped - 105 lines]
>     }
> }

My problem was that I couldn't change the contents.  Filling it
initially worked fine.
Knute Johnson - 08 Sep 2007 17:41 GMT
> My problem was that I couldn't change the contents.  Filling it
> initially worked fine.

So do you have it working now?

Just for my curiosity why do you change the content pane rather than
adding or removing components or containers?

Signature

Knute Johnson
email s/nospam/knute/

A Watcher - 08 Sep 2007 22:56 GMT
>> My problem was that I couldn't change the contents.  Filling it
>> initially worked fine.
[quoted text clipped - 3 lines]
> Just for my curiosity why do you change the content pane rather than
> adding or removing components or containers?

I'm not an expert at Java yet.  Can you point me to some examples of
doing that?
Martin Gregorie - 09 Sep 2007 00:10 GMT
>>> My problem was that I couldn't change the contents.  Filling it
>>> initially worked fine.
[quoted text clipped - 6 lines]
> I'm not an expert at Java yet.  Can you point me to some examples of
> doing that?

All AWT and Swing classes are subclasses of Component and JComponent
respectively. These are the classes that implement the setVisible()
method, so one way of controlling the GUI seen by the user is to build
all the window layouts you need during initialization and use
setVisible() to control which objects the user sees at various points
during program execution.

That will alter the GUI layout, which is what I'm guessing that you want
to do.

If all you want is to change the displayed content of a GUI component
then you'll find that there is usually a method that simply changes the
data to be displayed, e.g. JTextField.setText() or combination of
methods, e.g. to change a JTable's contents you change the content of
its associated TableModel and then notify JTable of the change by
calling a method such as TabelModel.fireTableDataChanged().

Signature

martin@   | Martin Gregorie
gregorie. | Essex, UK
org       |

Knute Johnson - 13 Sep 2007 01:28 GMT
>>> My problem was that I couldn't change the contents.  Filling it
>>> initially worked fine.
[quoted text clipped - 6 lines]
> I'm not an expert at Java yet.  Can you point me to some examples of
> doing that?

Here is a very simple example of adding and removing components and also
making a component visible or not.  Different layout managers will
respond differently to having components added or removed but if you
call validate, the layout manager will layout the components again.

Often one will set components as enabled or disabled to indicate to a
user that a particular feature is or is not available.  This is often
done with menus.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class test3 extends JPanel {
    JLabel north,center;

    public test3() {
        setLayout(new BorderLayout());

        center = new JLabel("Center",JLabel.CENTER);
        add(center,BorderLayout.CENTER);

        north = new JLabel("North",JLabel.CENTER);
        add(north,BorderLayout.NORTH);

        JButton south = new JButton("Toggle Center");
        south.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                if (center.isShowing())
                    center.setVisible(false);
                else
                    center.setVisible(true);
            }
        });
        add(south,BorderLayout.SOUTH);

        JButton west = new JButton("Remove North");
        west.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                if (north.isShowing()) {
                    remove(north);
                    validate();
                }
            }
        });
        add(west,BorderLayout.WEST);

        JButton east = new JButton("Add North");
        east.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                if (!north.isShowing()) {
                    add(north,BorderLayout.NORTH);
                    validate();
                }
            }
        });
        add(east,BorderLayout.EAST);
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            public void run() {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                test3 t3 = new test3();
                f.add(t3);
                f.pack();
                f.setVisible(true);
            }
        };
        EventQueue.invokeLater(r);
    }
}

Signature

Knute Johnson
email s/nospam/knute/

Roedy Green - 12 Sep 2007 16:54 GMT
On Fri, 07 Sep 2007 17:24:07 -0700, A Watcher
<stocksami@earthlink.net> wrote, quoted or indirectly quoted someone
who said :

>I use the setContentPane method to put a JPanel into a JFrame and then
>call validate and repaint.  That works fine.  What I can't do is
>change it.  I rerun the setContentPane method with a different JPanel
>and do the validate and repaint but nothing happens.  I am using java
>5.  Can someone suggest something I could try?

Normally you ADD JPanels to a JFrame.  Setting the contentPane is
meddling with the dark arts.
Signature

Roedy Green Canadian Mind Products
The Java Glossary
http://mindprod.com

Roedy Green - 13 Sep 2007 01:29 GMT
On Wed, 12 Sep 2007 15:54:45 GMT, Roedy Green
<see_website@mindprod.com.invalid> wrote, quoted or indirectly quoted
someone who said :

>Normally you ADD JPanels to a JFrame.  Setting the contentPane is
>meddling with the dark arts.

see http://mindprod.com/jgloss/jframe.html for sample code.
Signature

Roedy Green Canadian Mind Products
The Java Glossary
http://mindprod.com



Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.