ContentPane和JProgressBar不可见。

3

我创建了一个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。如您所见,代码完全相同。问题在于测试可以正常工作并正确显示。我已经添加了所有与对话框窗口的其他实现相关的代码。

4个回答

2
a) 进度条不应该是公共的。如果您想要更改它的值,则需要创建一个setter方法。
b) 您不应该使用JFrame作为子窗口。您应该使用JDialog,然后将框架指定为对话框的所有者。
c) JFrame或JDialog的默认布局是BorderLayout,因此没有必要重置布局。
d) 在一起使用setSize()和pack()是无用的。pack()将覆盖setSize()。使用其中之一即可。
e) 在组件上使用setSize()和setPreferredSize()是无用的。布局管理器将使用首选大小作为建议,然后根据其规则设置大小。
因此,在发布的几行中存在许多问题。虽然它们不太可能引起任何实际问题,但这使我想知道程序的其余部分看起来像什么。您可能会遗漏有助于我们解决问题的有价值的信息。
如果您需要进一步帮助,则需要创建一个短,自包含,可编译和可执行的示例程序(SSCCE),以演示不正确的行为。

你对d)是正确的。但是我不太确定c):new JFrame().getContentPane.getLayout()返回一个JRotePane$1。 - zedoo
我已经按照你建议的进行了一些更改,其中许多是之前你建议的方式,但在尝试修复问题时被剥离了。我制作了一个SSCCE并将其发布在上面。 - Kevin Stich

1

您应该设置进度条的preferredSize()size()。这样就可以让它出现了。


我在setStringPainted()之后,但在将其添加到内容面板之前添加了以下行:bar.setPreferredSize(new Dimension(200, 100)); bar.setSize(200, 100);但仍然没有显示。 - Kevin Stich

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值(无进度)相结合,看起来就像那样。

我相信您已经阅读了始终非常有价值的Swing教程部分: http://java.sun.com/docs/books/tutorial/uiswing/components/progress.html


getContentPane().setLayout(new BorderLayout()); getContentPane().add(bar, BorderLayout.CENTER);但是打包后没有出现bar。 - Kevin Stich

0

我的第一个猜测是在显示后交换z-order

setVisible(true);
toFront();

如果在非显示的小部件上执行 toFront() 操作,则无操作。


我会按照你提供的顺序保留这些调用,但仍然无法使面板可见。 - Kevin Stich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接