как заставить JInternalFrame заполнить контейнер и отключить функцию перетаскивания?

Я работаю над проектом, в мэйнфрейме есть JInternalFrames. Теперь нам нужно позволить им быть JFrame. Я рассматриваю возможность использования JFrame для удержания JInternalFrame. Проблема в том, что заголовок Internalframe есть, и пользователь может его перетаскивать.

Есть ли способ заставить внутренний фрейм работать как панель в JFrame? После поиска в Интернете я обнаружил, что кто-то удаляет заголовок.

У вас есть какие-нибудь идеи по этому поводу?

Спасибо вам!

обновление: Возможно, я ошибся. Настоящая проблема в том, что фрейм JInternal не может выйти из основного фрейма или каким-либо способом заставить его выглядеть так, как будто он находится вне фрейма?


person xiaohei    schedule 30.01.2013    source источник
comment
Самый простой способ - удалить JDesktopPane и заменить его панелью содержимого вашего JInternalFrame. Нет такого метода, как JInternalFrame.setUndecorated().   -  person Guillaume Polet    schedule 30.01.2013


Ответы (2)


Есть ли способ заставить внутренний фрейм работать как панель в JFrame?

Я не совсем понимаю, что вы имеете в виду под панелью, но, наверное, как JPanel? Конечно, можете, но почему, это мой вопрос, если вам не нужна какая-то быстрая плавающая панель, но чем вы говорите, что не хотите, чтобы она перетаскивалась? Так что я немного не уверен в ваших мотивах, и мне надоело отвечать ...

Проблема в том, что там есть заголовок Internalframe.

Ну вот код для удаления titlepane (нашел его здесь):

//remove title pane http://www.coderanch.com/t/505683/GUI/java/JInternalframe-decoration
BasicInternalFrameTitlePane titlePane =(BasicInternalFrameTitlePane)((BasicInternalFrameUI)jInternalFrame.getUI()).getNorthPane();
jInternalFrame.remove(titlePane);

и пользователь может перетаскивать его.

И я обнаружил, что это делает JInternalFrame неподвижным, удаляя MouseListener, которые делают его подвижным, но важно отметить, что нет необходимости удалять MouseListener, поскольку метод, используемый для его нераспаковываемого, удалит NorthPane, который MouseListener тоже добавлен, поэтому нам не нужно удалять его самим:

//remove the listeners from UI which make the frame move
BasicInternalFrameUI basicInternalFrameUI = ((javax.swing.plaf.basic.BasicInternalFrameUI) jInternalFrame.getUI());
for (MouseListener listener : basicInternalFrameUI.getNorthPane().getMouseListeners()) {
    basicInternalFrameUI.getNorthPane().removeMouseListener(listener);
}

И согласно вашему заголовку:

как заставить JInternalFrame заполнить Контейнер

Просто вызовите setSize(int width,int height) на JInternalFrame с параметрами JDesktopPanes width и height (размер JDesktopPane будет изменен путем переопределения getPreferredSize()).

Что даст нам это:

введите описание изображения здесь

import java.awt.Dimension;
import java.awt.HeadlessException;
import java.awt.event.MouseListener;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.SwingUtilities;
import javax.swing.plaf.basic.BasicInternalFrameTitlePane;
import javax.swing.plaf.basic.BasicInternalFrameUI;

/**
 *
 * @author David
 */
public class Test {

    public Test() {
        createAndShowGUI();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Test();

            }
        });
    }

    private void createAndShowGUI() throws HeadlessException {
        JFrame frame = new JFrame();
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        final JDesktopPane jdp = new JDesktopPane() {
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 300);
            }
        };

        frame.setContentPane(jdp);
        frame.pack();

        createAndAddInternalFrame(jdp);

        frame.setVisible(true);
    }

    private void createAndAddInternalFrame(final JDesktopPane jdp) {
        JInternalFrame jInternalFrame = new JInternalFrame("Test", false, false, false, false);
        jInternalFrame.setLocation(0, 0);
        jInternalFrame.setSize(jdp.getWidth(), jdp.getHeight());

        //remove title pane http://www.coderanch.com/t/505683/GUI/java/JInternalframe-decoration
        BasicInternalFrameTitlePane titlePane = (BasicInternalFrameTitlePane) ((BasicInternalFrameUI) jInternalFrame.getUI()).getNorthPane();
        jInternalFrame.remove(titlePane);

        /*
         //remove the listeners from UI which make the frame move
         BasicInternalFrameUI basicInternalFrameUI = ((javax.swing.plaf.basic.BasicInternalFrameUI) jInternalFrame.getUI());
         for (MouseListener listener : basicInternalFrameUI.getNorthPane().getMouseListeners()) {
         basicInternalFrameUI.getNorthPane().removeMouseListener(listener);
         }
         */
        jInternalFrame.setVisible(true);

        jdp.add(jInternalFrame);
    }
}
person David Kroukamp    schedule 30.01.2013
comment
Извините, я не носитель языка, и пост непонятен. Я считаю, что ваш ответ может быть тем, что я ищу, я попробую и вернусь. Спасибо!!! - person xiaohei; 31.01.2013
comment
Привет, я работаю над вашим кодом на компьютере Mac, кажется, getNorthPane возвращает null. Как получить строку заголовка на Mac? Можно ли изменить размер JInterFrame в соответствии с JFrame? - person xiaohei; 31.01.2013

Учитывая ваши требования, я предлагаю вам просто использовать простой JPanel внутри вашей JFrame панели содержимого.

person Dan D.    schedule 30.01.2013
comment
+1 да может быть то, что нужно OP, поскольку он / она может нарисовать свой собственный Border и изменить фон, чтобы он выглядел как JInternalFrame, если это то, что ему / ей нужно. - person David Kroukamp; 30.01.2013
comment
Привет, я пытаюсь заменить некоторые JInternalFrame на JFrame, поскольку пользователь хочет перетащить их из главного окна. Но JInternalFrame довольно сложен, его сложно преобразовать в JFrame. Поэтому я подумал, что будет проще поместить их в другой JFrame. После модификации работает нормально. Но есть проблемы с пользовательским интерфейсом. Один из них я описал в посте. Другие могут быть передачей некоторых событий из JFrame в его внутренний JInternalFrame. Может у вас есть идеи получше по поводу конвертации? - person xiaohei; 31.01.2013