首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ContentPane和JProgressBar不可见

ContentPane和JProgressBar不可见
EN

Stack Overflow用户
提问于 2009-08-10 21:55:51
回答 4查看 2.7K关注 0票数 3

我已经创建了一个在内容窗格中具有一个组件JProgressBarJDialog扩展。JProgressBar是公共的,因为我希望该值由owner类设置。当我创建一个新的对话框时,内容窗格根本不会出现,导致显示的是它背后的任何内容,而不是进度条:

代码语言:javascript
复制
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的用法代码如下

代码语言:javascript
复制
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。如您所知,代码是完全相同的。问题是测试工作正常且显示正确。我已经添加了对话框窗口的其他实现所涉及的所有代码。

EN

回答 4

Stack Overflow用户

发布于 2009-08-11 02:02:19

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),它展示了不正确的行为。

票数 2
EN

Stack Overflow用户

发布于 2009-08-10 21:59:30

您应该设置进度条的preferredSize()size()。这应该会让它看起来。

票数 1
EN

Stack Overflow用户

发布于 2009-08-10 22:13:05

您可以使用BorderLayout:

代码语言:javascript
复制
contentPane.setLayout(new BorderLayout());
contentPane.add(bar, BorderLayout.CENTER);
frame.setSize(200,200);

好的,我做了一些测试:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1257440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档