Re: Invsible Button!?
Sergio wrote:
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.