[英]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.