почему JInternalFrame удаляет все остальные компоненты

я закончил с добавлением JInternalFrame внутри моего JFrame, и способ добавления рамки - это щелкнуть значок JMenuItem, и это идет нормально, но когда когда-либо добавляется рамка, старый компонент удаляется, и появляется белый цвет. то, что я пытаюсь сделать, это установить исправление JInternalFrame местоположения с другим компонентом без эффекта другого компонента

код для JInternalFrame

    package animeaidvlcj;

import javax.swing.JInternalFrame;


/* Used by InternalFrameDemo.java. */
public class MyInternalFrame extends JInternalFrame {
    static int openFrameCount = 0;
    static final int xOffset = 0, yOffset = 25;

    public MyInternalFrame() {
        super("Document #" + (++openFrameCount), 
              true, //resizable
              true, //closable
              true, //maximizable
              true);//iconifiable

        //...Create the GUI and put it in the window...

        //...Then set the window size or call pack...
        setSize(300,300);

        //Set the window's location.
        setLocation(xOffset*openFrameCount, yOffset*openFrameCount);
    }
}

Код действия

 Action newAction = new AbstractAction("New", newIcon) {
        @Override
        public void actionPerformed(ActionEvent e) {
            desktop = new JDesktopPane();
            createFrame();
            setContentPane(desktop);
            desktop.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
        }
    };

создать метод

protected void createFrame() {
    MyInternalFrame frame = new MyInternalFrame();
    frame.setVisible(true); //necessary as of 1.3
    desktop.add(frame);
    try {
        frame.setSelected(true);
    } catch (java.beans.PropertyVetoException e) {}
}

person loverBoy    schedule 29.04.2014    source источник
comment
Чтобы быстрее получить помощь, опубликуйте MCVE (минимальный полный и проверяемый пример).   -  person Andrew Thompson    schedule 29.04.2014


Ответы (1)


«почему JInternalFrame удаляет все остальные компоненты»

Итак, сначала посмотрите на этот код в своем Action

desktop = new JDesktopPane();
createFrame();
setContentPane(desktop);  <== this line in particular

Вы устанавливаете панель содержимого фрейма (при условии, что setContenPane() вызывает фрейм класса) с помощью desktop, что удалит предыдущую панель содержимого, в которой находятся все ваши компоненты. Так что единственное, что появится, это desktop вместе с новым JInternalFrame.

Если только вы не создаете многодокументный интерфейс (MDI), для которого в основном предназначены панели рабочего стола и внутренние рамки. , я предлагаю вам просто использовать JDialog и забыть о DesktopPane. Вы можете посмотреть как использовать диалоговые окна. Это почти то же самое, что и создание JFrame, за исключением того, что у вас есть возможность модальности .

person Paul Samsotha    schedule 29.04.2014
comment
я пытаюсь использовать другой фрейм для vlcj, поэтому другие варианты - плохая идея, но могу ли я заменить setContentPane (рабочий стол) на другой, например jpanel - person loverBoy; 29.04.2014
comment
Оба фрейма должны быть доступны одновременно? Например, когда открыто новое окно, хотите ли вы иметь доступ к основному фрейму? - person Paul Samsotha; 29.04.2014
comment
да, абсолютно. но я не уверен, потому что я думаю, что vlcj может работать в другом фрейме, пока я использую основной фрейм - person loverBoy; 29.04.2014
comment
Вы можете просто создать Modelesss JDialog Вы создаете его точно так же, как кадр. Единственная разница в том, что он не будет находиться внутри основной рамы. Но если вы хотите использовать jdeesktoppane с внутренней рамкой, вам придется реструктурировать свое приложение, чтобы оно было построено вокруг панели рабочего стола. Вы можете просто переключать панели содержимого с помощью фрейма и ожидать, что компоненты исходной панели содержимого по-прежнему будут отображаться. Для диалога просто setModel(false). - person Paul Samsotha; 29.04.2014
comment
может ли JDialog быть встроен в JFrame - person loverBoy; 29.04.2014
comment
Нет. Если вы читаете мой комментарий, там написано, что он не будет содержаться внутри кадра. Если вам нужна эта функция, как я уже сказал, вам придется реструктурировать свое приложение вокруг этой панели рабочего стола. - person Paul Samsotha; 29.04.2014