簡體   English   中英

ContentPane和JProgressBar不可見

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM