Invsible Button!?

S

Sergio

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.
 
M

Matt Humphrey

Sergio said:
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);

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);
validate();
}

protected JPanel createPanel() {
panel = new JPanel();

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

Matt Humphrey (e-mail address removed) http://www.iviz.com/
 
B

Bart Rider

Sergio said:
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();

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);
validate();
}

protected JPanel createPanel() {
panel = new JPanel();

.... but every newly created panel has a FlowLayout.
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);

You don't need to explicitely set the button visible.
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.

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.
 
S

Sergio

Bart Rider ha scritto:
Your global var 'panel' is set by createPanel() and
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:

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.

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.
 
B

Bart Rider

Sergio said:
[...skip...]

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.

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,764
Messages
2,569,564
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top