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 / August 2006

Tip: Looking for answers? Try searching our database.

Invsible Button!?

Thread view: 
Sergio - 20 Aug 2006 20:40 GMT
Dear experts,
i'm a student from Italy and i'm approaching java language.
I have a curious problem with the Swing components (Java 1.5).
I've wrote this class for a customizable progress monitor frame (very
simple):

public class ProgressMonitor extends JFrame{
   /**
    *
    */
    private static final long serialVersionUID = 1L;
    public final static int ONE_SECOND = 1000;

   private JPanel panel;
   public static JProgressBar progressBar;
   public static int BAR_MAX;
   private JButton stopButton;

   public ProgressMonitor(String title) {
       super(title);
       panel = createPanel();

       setPreferredSize(new Dimension(310, 100));
       setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
       setLocation(350, 200);
       add(panel, BorderLayout.CENTER);
       pack();
       setVisible(true);
       validate();
   }

   protected JPanel createPanel() {
       panel = new JPanel();
       stopButton = new JButton("Stop!");

       BAR_MAX = AnalisiParagrafi.getNumberOfParags() - 1;
       if(BAR_MAX == -1) BAR_MAX = 0;
       progressBar = new JProgressBar(0, BAR_MAX);
       progressBar.setPreferredSize(new Dimension(300, 20));
       progressBar.setValue(0);
       progressBar.setStringPainted(true);
       panel.add(progressBar, BorderLayout.CENTER);
       stopButton.setEnabled(true);
       stopButton.setVisible(true);
       panel.add(stopButton, BorderLayout.SOUTH);
        return panel;
   }

   /**
    * Create the GUI and show it.  For thread safety,
    * this method should be invoked from the
    * event-dispatching thread.
    */

    public void updateProgressBar(int i){

        Rectangle progressRect = progressBar.getBounds();
        progressRect.x = 0;
        progressRect.y = 0;
        progressBar.setValue(i);
        progressBar.paintImmediately(progressRect);
        if(i == BAR_MAX) this.setVisible(false);

    }

}

In this frame i've put a progress bar (updated by an index 'i') and a
Stop Button.
The problem is that, when i invoke this class during main program's
elaboration, it displays the main frame, the progress bar (an
appropriate external method udpate it) but there is no button in the
window!
I can't really understand why...the strange thing is that if i call
this class with this simple line of code (out of the main program):
ProgressMonitor pm = new ProgressMonitor("Program is running...");
...it works!

Does anybody know this problem?
Thanks in advance for all your help!

Sergio.
Matt Humphrey - 20 Aug 2006 21:01 GMT
> Dear experts,
> i'm a student from Italy and i'm approaching java language.
[quoted text clipped - 22 lines]
>    setLocation(350, 200);
>    add(panel, BorderLayout.CENTER);

If you are expecting to use the BorderLayout, you must set the container's
layout manager setLayout (new BorderLayout ()).  The default is flow
layout--I'm not sure what you'll get without it.

>    pack();
>        setVisible(true);
[quoted text clipped - 3 lines]
>    protected JPanel createPanel() {
>    panel = new JPanel();

And set it here also.
panel.setLayout (new BorderLayout ());

Matt Humphrey matth@ivizNOSPAM.com http://www.iviz.com/
Bart Rider - 21 Aug 2006 17:22 GMT
> Dear experts,
> i'm a student from Italy and i'm approaching java language.
[quoted text clipped - 17 lines]
>         super(title);
>         panel = createPanel();

Your global var 'panel' is set by createPanel() and
then reassigned with the return value. Big flaw in
programming.

>         setPreferredSize(new Dimension(310, 100));
>         setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
>         setLocation(350, 200);
>         add(panel, BorderLayout.CENTER);

The contentPane (which is a panel) of a frame has the
BorderLayout ...

>         pack();
>         setVisible(true);
[quoted text clipped - 3 lines]
>     protected JPanel createPanel() {
>         panel = new JPanel();

... but every newly created panel has a FlowLayout.

>         stopButton = new JButton("Stop!");
>
[quoted text clipped - 7 lines]
>         stopButton.setEnabled(true);
>         stopButton.setVisible(true);

You don't need to explicitely set the button visible.

>         panel.add(stopButton, BorderLayout.SOUTH);
>         return panel;
[quoted text clipped - 34 lines]
>
> Sergio.

Despite some flaws in your prog I changed nothing except:
adding this:

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

adding this to the classes body:

    public static void main( String []args ) {
        new ProgressMonitor( "Hallo" );
    }

and replacing the line
>         BAR_MAX = AnalisiParagrafi.getNumberOfParags() - 1;
with
        BAR_MAX = 200;
.

I didn't get the problem you discribed, the button you
missed was placed exactly beneath the progress bar. (after
resizing the window it moved to a position after the bar,
so you might consider the hint Matt gave.)

Maybe you should report back the exact circumstances under
which your prog runs.

Best regards,
Bart

P.S. from these two lines I know you use java version 1.5
>         setPreferredSize(new Dimension(310, 100));
>         add(panel, BorderLayout.CENTER);
but even with 1.4 I cannot reproduce your error.
Sergio - 21 Aug 2006 20:45 GMT
Bart Rider ha scritto:

> >     public ProgressMonitor(String title) {
> >         super(title);
[quoted text clipped - 3 lines]
> then reassigned with the return value. Big flaw in
> programming.

...you know, i'm a beginner, let me make these mistakes :P
i don't want my program is perfect, i want that my program works.

[cut]
> Despite some flaws in your prog I changed nothing except:
> adding this:
[quoted text clipped - 21 lines]
> Maybe you should report back the exact circumstances under
> which your prog runs.

as i've noticed if u invoke my class with a simple call procedure, it
works fine.
I'll try to explain how my program works (sorry for my poor english).

My program makes some operations on the paragraphs of a text.

When i push a button 'GO' in the main window of my program, the text's
processing starts and this Progress Monitor panel becomes visible.
I need, in this Progress Monitor panel, the progress bar updated for
each paragraph, (the 'i' index is the number of the current paragraph,
BAR_MAX is the edge of my progress bar) and the stop button visible to
stop the execution when i want.
I dont use threads (another big mistake...i know) and i've tried to
follow Matt's advice, but it doesn't work.

I wanna thank all of you for the precious help.

Sergio.
Bart Rider - 22 Aug 2006 10:50 GMT
> [...skip...]
>
[quoted text clipped - 10 lines]
>
> Sergio.

When you push your 'GO' button, code in any actionPerformed()-
method associated with the button is run. Do you leave that
actionPerformed method without doing anything and WITHOUT
disposing the ProgressMonitor frame? Try it and I think, the
frame is shown properly.

I think, the problem you face is that the GUI is not updated
properly, thus you don't see the 'stop'-button. Note, that
the GUI runs wrapped by an Event Dispatching Thread (edt).
When you click the button your own methods (actionPerformed)
are executed and the edt is not able to update the GUI until
your method is left.

Facing this, there is now other way than threads. :)

Best regards,
Bart


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.