我已经创建了一个在内容窗格中具有一个组件JProgressBar
的JDialog
扩展。JProgressBar
是公共的,因为我希望该值由owner类设置。当我创建一个新的对话框时,内容窗格根本不会出现,导致显示的是它背后的任何内容,而不是进度条:
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。如您所知,代码是完全相同的。问题是测试工作正常且显示正确。我已经添加了对话框窗口的其他实现所涉及的所有代码。
发布于 2009-08-11 02:02:19
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),它展示了不正确的行为。
发布于 2009-08-10 21:59:30
您应该设置进度条的preferredSize()
和size()
。这应该会让它看起来。
发布于 2009-08-10 22:13:05
您可以使用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
https://stackoverflow.com/questions/1257440
复制相似问题