[英]ContentPane and JProgressBar not visible
我在内容窗格中创建了一个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窗口的其他实现相关的所有代码。
a)进度条不应公开。 如果要更改其值,请创建一个setter方法。
b)您不应该将JFrame用作子窗口。 您应该使用JDialog,然后将框架指定为对话框的所有者。
c)JFrame或JDialog的默认布局是BorderLayout,因此无需重置布局。
d)一起使用setSize()和pack()是没用的。 包将覆盖setSize()。 使用其中一个。
e)在组件上使用setSize()和setPreferredSize()是没用的。 布局管理器将使用首选大小作为建议,然后根据其规则设置大小。
所以从发布的几行来看,存在很多问题。 虽然它们不太可能引起任何实际问题,但它让我想知道程序的其余部分是什么样的。 您可能会遗漏有助于我们解决问题的宝贵信息。
如果您需要进一步的帮助,那么您需要创建一个简短,自包含,可编译和可执行的示例程序 (SSCCE),以演示不正确的行为。
您应该设置进度条的preferredSize()
和size()
。 这应该会出现。
你可以使用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值(没有进展)结合起来就是这样。
我相信你已经阅读了总是非常有价值的swing教程部分: http : //java.sun.com/docs/books/tutorial/uiswing/components/progress.html
我的第一个猜测是在显示后交换z顺序
setVisible(true);
toFront();
如果toFront()在非显示的小部件上没有操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.