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

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

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

У вас есть хорошая идея по этому поводу?

Спасибо вам!

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

2 ответа

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

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

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

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

//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которые делают его подвижным, но важно отметить, что нет необходимости удалять MouseListeners, поскольку метод, используемый, чтобы сделать его неразрушимым, удалит 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);
    }
}

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

Другие вопросы по тегам