ContentPane和JProgressBar不可见

时间:2009-08-10 21:55:51

标签: java user-interface swing

我在内容窗格中创建了一个JDialog扩展,其中包含一个组件JProgressBarJProgressBar是公共的,因为我希望值由所有者类设置。当我创建一个新的对话框时,内容窗格根本不显示,导致显示它背后的任何内容而不是进度条:

public class ProgressBarDialog extends JDialog {
    public JProgressBar bar;

    public ProgressBarDialog(Frame owner, String title) {
        super(owner, title);
        bar = new JProgressBar(JProgressBar.HORIZONTAL, 0, 100);
        bar.setValue(0);
        bar.setStringPainted(true);
        bar.setPreferredSize(new Dimension(200, 100));

        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(bar, BorderLayout.CENTER);

        setSize(200, 100);
        setLocationRelativeTo(null);
        setVisible(true);
        toFront();
    }
    public void setProgress(int p) {
        bar.setValue(p);
    }
}

ProgressBarDialog的使用代码如下

ProgressBarDialog progBarDialog = new ProgressBarDialog(null,"Submitting");
//Stuff gets done
progBarDialog.setProgress(20);
//Stuff gets done
progBarDialog.setProgress(45);
//Stuff gets done
progBarDialog.setProgress(70);
//Stuff gets done
progBarDialog.setProgress(100);
//Stuff gets done
progBarDialog.dispose();

我有什么遗漏,因为这是(我认为)一个相当简单的实现吗?

根据camickr的建议,我在这里创建了一个测试SSCCE:TestDialog.java。如您所知,代码完全相同。问题是测试工作正常并显示。我添加了与Dialog窗口的其他实现相关的所有代码。

4 个答案:

答案 0 :(得分:2)

a)进度条不应公开。如果要更改其值,请创建一个setter方法。

b)您不应该将JFrame用作子窗口。您应该使用JDialog,然后将框架指定为对话框的所有者。

c)JFrame或JDialog的默认布局是BorderLayout,因此无需重置布局。

d)一起使用setSize()和pack()是没用的。包将覆盖setSize()。使用其中一种。

e)在组件上使用setSize()和setPreferredSize()是没用的。布局管理器将使用首选大小作为建议,然后根据其规则设置大小。

所以从发布的几行来看,存在很多问题。虽然它们不太可能引起任何实际问题,但它让我想知道程序的其余部分是什么样的。您可能会遗漏有助于我们解决问题的宝贵信息。

如果您需要进一步的帮助,则需要创建Short, Self Contained, Compilable and Executable, Example Program(SSCCE),以证明行为不正确。

答案 1 :(得分:1)

您应该设置进度条的preferredSize()size()。这应该会出现。

答案 2 :(得分:0)

您可以使用BorderLayout:

contentPane.setLayout(new BorderLayout());
contentPane.add(bar, BorderLayout.CENTER);
frame.setSize(200,200);

好的,我做了一些测试:

import java.awt.Dimension; 
import javax.swing.JFrame; 
import javax.swing.JProgressBar; 
public class FrameTest {    
    public static void main(String[] args) {        
        JFrame f = new JFrame();        
        JProgressBar b = new JProgressBar(0,100);
        b.getModel().setValue(50);      
        f.getContentPane().add(b);      
        f.setSize(new Dimension(200,200)); 
        f.setVisible(true);     
    }  
}

这会绘制半框填充的整个内容,因此并不是ProgressBar不可见。只是它填充了整个内容,它与模型中的0值(没有进展)结合起来就是这样。

我确定你已经阅读了总是非常有价值的摇摆教程部分: http://java.sun.com/docs/books/tutorial/uiswing/components/progress.html

答案 3 :(得分:0)

我的第一个猜测是在显示

后交换z顺序
setVisible(true);
toFront();

如果未显示的小部件上的toFront()no-ops。