Как получить z-порядок JInternalFrames в JDesktopPane - PullRequest
4 голосов
/ 09 марта 2009

Как можно получить порядок z (глубину слоя) всех JInternalFrames внутри JDesktopPane. Кажется, нет прямого пути для этого. Есть идеи?

1 Ответ

4 голосов
/ 09 марта 2009

Хотя я не пробовал этого, класс Container (который является предком класса JDesktopPane) содержит getComponentZOrder метод. Передав Component, который находится в Container, он вернет z-порядок как int. Component с наименьшим значением z-порядка, возвращаемым методом, рисуется последним, другими словами, рисуется сверху.

В сочетании с методом JDesktopPane.getAllFrames, который возвращает массив JInternalFrames, я думаю, что можно получить z-порядок внутренних кадров.

Редактировать

Я на самом деле пробовал это, и, кажется, работает:

final JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JDesktopPane desktopPane = new JDesktopPane();
desktopPane.add(new JInternalFrame("1") {
    {
        setVisible(true);
        setSize(100, 100);
    }
});
desktopPane.add(new JInternalFrame("2") {
    {
        setVisible(true);
        setSize(100, 100);
    }
});
desktopPane.add(new JInternalFrame("3") {
    JButton b = new JButton("Get z-order");
    {
        setVisible(true);
        setSize(100, 100);
        getContentPane().add(b);
        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e)
            {
                JInternalFrame[] iframes = desktopPane.getAllFrames();
                for (JInternalFrame iframe : iframes)
                {
                    System.out.println(iframe + "\t" +
                            desktopPane.getComponentZOrder(iframe));
                }
            }
        });
    }
});

f.setContentPane(desktopPane);
f.setLocation(100, 100);
f.setSize(400, 400);
f.validate();
f.setVisible(true);

В приведенном выше примере, JDesktopPane заполняется тремя JInternalFrame s, а третий имеет кнопку, которая выведет список JInternalFrame s и его z-порядок в System.out.

Пример вывода следующий:

JDesktopPaneTest$3[... tons of info on the frame ...]    0
JDesktopPaneTest$2[... tons of info on the frame ...]    1
JDesktopPaneTest$1[... tons of info on the frame ...]    2

В этом примере используется множество анонимных внутренних классов, просто для того, чтобы код был коротким, но реальная программа, вероятно, не должна этого делать.

...