Как я могу выбрать по умолчанию InternalFrame на JDesktopPane? - PullRequest
0 голосов
/ 03 ноября 2010

У меня есть 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 и его выбранные по умолчанию? Когда я запускаю приложение, внутренний фрейм похож на фоновый, он не выбран, он не сфокусирован.

Ответы [ 2 ]

1 голос
/ 03 ноября 2010

Посмотрите Как использовать внутренние рамки Java-учебник. Это хороший пример и используется следующее:

protected void createFrame() {
    MyInternalFrame frame = new MyInternalFrame();
    frame.setVisible(true);
    desktop.add(frame);
    try {
        frame.setSelected(true);
    } catch (java.beans.PropertyVetoException e) {}
}
0 голосов
/ 03 ноября 2010

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

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

  1. Создать основной кадр
  2. Создать рабочий стол
  3. Создать внутреннюю рамку, но не делать ее видимой
  4. Запустить поток, который устанавливает видимое значение true на внутреннем фрейме, но поток может подождать, пока не появится рабочий стол
  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();
    }
}
...