我在内容窗格中创建了一个JDialog
扩展,其中包含一个组件JProgressBar
。 JProgressBar
是公共的,因为我希望值由所有者类设置。当我创建一个新的对话框时,内容窗格根本不显示,导致显示它背后的任何内容而不是进度条:
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窗口的其他实现相关的所有代码。
答案 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。