【问题标题】:JDialog does not show componentsJDialog 不显示组件
【发布时间】:2012-09-19 13:22:35
【问题描述】:

我对扩展 JDialog 的类有一个奇怪的问题:

class MyDialog extends JDialog {

    private static final long serialVersionUID = 11564288421L;

    public MyDialog(JFrame owner, MyObject object) {
        super(owner, true);
        setSize(300, 200);
        setLocationRelativeTo(owner);
        String title = "Object ID: " + object.getId(); 
        setTitle(title);
        setVisible(true);

        JLabel lblTitle = new JLabel(title);
        lblTitle.setBounds(0, 0, this.getWidth(), 22);
        lblTitle.setFont(new java.awt.Font("Tahoma", 1, 18));
        lblTitle.setHorizontalAlignment(SwingConstants.CENTER);
        getContentPane().setLayout(null);
        getContentPane().add(lblTitle);
    }
}

当我用new MyDialog(existingJFrameInstance, existingMyObjectInstance); 调用它时,MyDialog 会显示并且标题很好,但它的ContentPane 中没有任何内容。

如果我将班级更改为:

class MyDialog extends JFrame {

    private static final long serialVersionUID = 11564288421L;

    public MyDialog(JFrame owner, MyObject object) {
        super();
        setSize(300, 200);
        setLocationRelativeTo(owner);
        String title = "Object ID: " + object.getId(); 
        setTitle(title);
        setVisible(true);

        JLabel lblTitle = new JLabel(title);
        lblTitle.setBounds(0, 0, this.getWidth(), 22);
        lblTitle.setFont(new java.awt.Font("Tahoma", 1, 18));
        lblTitle.setHorizontalAlignment(SwingConstants.CENTER);
        getContentPane().setLayout(null);
        getContentPane().add(lblTitle);
    }
}

一切正常。我无法想象这里发生了什么:\

我需要窗口是模态的,这就是为什么我必须使用JDialog 而不是JFrame。

我尝试在所有可能的组合中使用this.pack();、this.validate();、getContentPane().revalidate();、getContentPane().repaint(); 等等等等,我在 EDT 中(SwingUtilities.isEventDispatchThread() 返回true)。

请帮忙:)

【问题讨论】:

    标签: java swing jdialog contentpane


    【解决方案1】:

    只需将您的 setVisible(true); 调用移至构造函数的末尾即可。

    【讨论】:

    • @tmh setVisible(true); 必须是构造函数中的最后一行代码,否则你会显示empty container
    • 确实,setVisible(true) 应该是构造函数中的最后一行代码,否则您会注意到控件显示的延迟,但在这种情况下,问题在于 getContentPane() 对 @ 的调用987654326@(经测试确认)
    【解决方案2】:

    删除JDialog 版本中的getContentPane() 调用,它应该可以工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-24
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多