2009-08-10 68 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