【问题标题】:Determine how much Top-Level Containers are opened确定打开了多少顶级容器
【发布时间】:2011-06-09 14:12:47
【问题描述】:

哪个方法可以返回,如何找到打开的顶级容器的数量

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SuperConstructor extends JFrame {

    private static final long serialVersionUID = 1L;

    public SuperConstructor() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setPreferredSize(new Dimension(300, 300));
        setTitle("Super constructor");
        Container cp = getContentPane();
        JButton b = new JButton("Show dialog");
        b.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent evt) {
                FirstDialog firstDialog = new FirstDialog(SuperConstructor.this);
            }
        });
        cp.add(b, BorderLayout.SOUTH);
        pack();
        setVisible(true);
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                SuperConstructor superConstructor = new SuperConstructor();
            }
        });
    }

    private class FirstDialog extends JDialog {

        private static final long serialVersionUID = 1L;

        FirstDialog(final Frame parent) {
            super(parent, "FirstDialog");
            setPreferredSize(new Dimension(200, 200));
            setLocationRelativeTo(parent);
            setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            setModalityType(Dialog.ModalityType.DOCUMENT_MODAL);
            JButton bNext = new JButton("Show next dialog");
            bNext.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent evt) {
                    SecondDialog secondDialog = new SecondDialog(parent, false);
                }
            });
            add(bNext, BorderLayout.SOUTH);
            pack();
            setVisible(true);
        }
    }
    private int i;

    private class SecondDialog extends JDialog {

        private static final long serialVersionUID = 1L;

        SecondDialog(final Frame parent, boolean modal) {
            //super(parent); // Makes this dialog unfocusable as long as FirstDialog is visible
            setPreferredSize(new Dimension(200, 200));
            setLocation(300, 50);
            setModal(modal);
            setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            setTitle("SecondDialog " + (i++));
            JButton bClose = new JButton("Close");
            bClose.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent evt) {
                    setVisible(false);
                }
            });
            add(bClose, BorderLayout.SOUTH);
            pack();
            setVisible(true);
        }
    }
}

【问题讨论】:

    标签: java swing containers


    【解决方案1】:

    Window[] allWindows = Window.getWindows(); ?

    【讨论】:

      【解决方案2】:

      由于 J2EE 使用“容器”这个词的特定含义,因此最好在示例中说“有多少顶级对话框”。请注意,在 Swing 中,“顶部”也具有非常特定的含义,因此只能有一个“顶部”项目,即(或将要)绘制在所有其他项目之上的项目。由于答案“一个”可能不是您需要的答案,我猜您的意思是“打开了多少对话框?”

      计算打开对话框的方法是在SuperConstructor 类中添加一个可以保存打开对话框“计数”的成员。在按钮的动作侦听器中,您创建了一个新对话框。您可以将用于增加计数的代码放入表示对话框的类中,也可以放入创建对话框的操作侦听器中。两种技术都可以,但如果您需要偏好,请将其放入动作侦听器(嵌入在 SuperConstructor 类中)是我的偏好。

      如果您需要计数不仅仅是打开的对话框的计数,您需要侦听对话框关闭事件并在对话框关闭时减少计数。

      请注意,将对话框设置为可见与删除对话框不同,因此请注意查看可见性或存在(取决于您所需的需要),但不要编写在存在时递增但在递减时递减的代码可见性(反之亦然)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-24
        • 2012-12-02
        • 2014-03-23
        相关资源
        最近更新 更多