繁体   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