2009-08-10 19 views
3

我創建了一個JDialog擴展,其內容窗格中包含一個組件JProgressBarJProgressBar是公開的,因爲我想要由所有者類設置值。當我創建一個新的對話框,內容窗格中不會出現在所有的,導致無論是顯示的,而不是進度條背後:ContentPane和JProgressBar不可見

Since I'm not allowed to use img tags...

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。正如你所看到的,代碼完全一樣。問題是測試正常工作並顯示。我添加了與對話框窗口的其他實現有關的所有代碼。

回答

1

您應該設置進度條的preferredSize()size()。這應該讓它出現。

+0

我在setStringPainted()之後添加了這些行,但在將其添加到內容窗格之前添加了這些行: bar.setPreferredSize(new Dimension(200,100)); bar.setSize(200,100); 它仍然沒有顯示。 – 2009-08-10 22:07:19

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);  
    } 
} 

此畫幀的全部內容填充一半,所以它不是該進度不可見。它只是填充整個內容,並在模型中加上一個0值(沒有進展),看起來就像那樣。

我敢肯定,你已經閱讀了總是很寶貴的擺動教程部分:在時,顯示

setVisible(true); 
toFront(); 

的toFront(後 http://java.sun.com/docs/books/tutorial/uiswing/components/progress.html

+0

getContentPane()。setLayout(new BorderLayout()); getContentPane()。add(bar,BorderLayout.CENTER); 和一個包沒有讓酒吧出現。 – 2009-08-10 22:17:26

0

我的第一個猜測是交換z順序)在未顯示的小部件上禁用。

+0

我將按照您提供的順序保留呼叫,但仍不會使面板可見。 – 2009-08-10 22:31:22

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),它演示了不正確的行爲。

+0

你對d)。但是我不太確定c):新的JFrame()。getContentPane.getLayout()返回一個JRotePane $ 1。 – zedoo 2009-08-11 06:52:50

+0

我已經提出了一些你建議的改變,其中許多是你事先建議的方式,但是在試圖解決這個問題時被剝離出來。我做了一個SSCCE並將其張貼在上面。 – 2009-08-11 15:39:06