защо 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.

Освен ако не създавате Multiple Document Interface (MDI), за кои панели на работния плот и вътрешни рамки са основно , предлагам ви просто да използвате JDialog и да забравите DesktopPane. Можете да видите Как да използвате диалогови прозорци. Това е почти същото като създаването на JFrame, с изключение на това, че имате опцията за модалност.

person Paul Samsotha    schedule 29.04.2014
comment
Опитвам се да използвам друга рамка за vlcj, така че опциите Other са лоша идея, но мога ли да заменя setContentPane (desktop) с други като 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