Как я могу выбрать по умолчанию InternalFrame на JDesktopPane?

У меня есть JFrame с JDesktopPane и внутри JDesktopPane я запускаю конструктор JInternalFrame. (Это приложение, подобное пользователям аутентификации, с пользователем текстового поля и пропуском текстового поля)

Я запускаю внутреннюю так:

MyInternalFrame internalF = new MyInternalFrame();
desktopPane.add(internalF);

Я пытаюсь с:

internalF.setVisible(true);
internalF.setSelected(true);
desktopPane.getDesktopManager().activateFrame(internal);
desktopPane.setSelectedFrame(internal);

Как я могу запустить JInternalFrame и выбрать его по умолчанию? Когда я запускаю приложение, внутренний кадр находится в фоновом режиме, он не выбран, он не сфокусирован.


person wooshot    schedule 03.11.2010    source источник


Ответы (2)


Вы можете сделать внутреннюю рамку видимой ПОСЛЕ создания рабочего стола и отображения основной рамки. В этом случае рамка будет выбрана по умолчанию.

Итак, один пример того, что вы можете сделать:

  1. Создать основной кадр
  2. Создать рабочий стол
  3. Создайте внутреннюю рамку, но не делайте ее видимой
  4. Запустите поток, который устанавливает значение visible во внутреннем фрейме, но поток может подождать, пока не отобразится рабочий стол.
  5. Сделайте основной кадр видимым
  6. В потоке вызовите internalFrame.setVisible(true) и выйдите из потока.

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

Вы можете придумать другое решение без использования потоков, но с написанием обработчиков событий основного фрейма. В любом случае, чтобы внутренний фрейм был виден после его отображения, вы должны показать его ПОСЛЕ отображения рабочего стола с основным фреймом.

Вот пример, который вы можете использовать:

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.HeadlessException;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;


public class Main extends JFrame {

    private static final long serialVersionUID = 1L;

    private Internal internalFrame;

    public Main() throws HeadlessException {
        super("Internal Frame Test");

        setBounds(10, 10, 600, 400);

        setDefaultCloseOperation(EXIT_ON_CLOSE);

        this.setLayout(new BorderLayout());

        add(createDesktop(), BorderLayout.CENTER);

        addWindowListener(new WindowAdapter() {
            public void windowOpened(WindowEvent e) {
                internalFrame.setVisible(true);
            }
        });

        setVisible(true);
    }

    private Component createDesktop() {
        JDesktopPane d = new JDesktopPane();

        internalFrame = new Internal("first");
        d.add(internalFrame);

        return d;
    }

    public static class Internal extends JInternalFrame {

        private static final long serialVersionUID = 1L;

        public Internal(String title) {
            super(title);
            setBounds(10, 10, 300, 100);
        }
    }

    public static void main(String[] a) {
        new Main();
    }
}
person Yuriy Tkach    schedule 03.11.2010
comment
Я добавил пример. Можешь попробовать. - person Yuriy Tkach; 03.11.2010

Ознакомьтесь с руководством по Java Как использовать внутренние фреймы. Это дает хороший пример и использует следующее;

protected void createFrame() {
    MyInternalFrame frame = new MyInternalFrame();
    frame.setVisible(true);
    desktop.add(frame);
    try {
        frame.setSelected(true);
    } catch (java.beans.PropertyVetoException e) {}
}
person Qwerky    schedule 03.11.2010
comment
+1, учебник не только помогает с этим вопросом, но и может использоваться в качестве справочного материала для будущих проблем. - person camickr; 03.11.2010