how to make JInternalFrame fill the Container and disable the dragging feature?

时光毁灭记忆、已成空白 提交于 2019-12-20 02:56:46

问题


I'm working on a project, there are JInternalFrames in the mainframe. Now, we need to let them to be JFrame. I'm considering using a JFrame to hold on JInternalFrame. The problem is that the titlebar of Internalframe is there, and user can drag it around.

Is there any way to make the Internal frame work like a pane in the JFrame? After searching on the Internet, I found somebody removes the titlepane.

Do you have any good idea on this?

Thanks you!

update: Maybe I was on the wrong track. The real problem is the JInternal frame can not get out of the main Frame, or any way to make it look like it's out side of the frame?


回答1:


Is there any way to make the Internal frame work like a pane in the JFrame

Im not sure by what you mean by pane, but I guess like a JPanel? Of course you can but why, would be my question, unless you want some sort of quick floating panel, but than you say you dont want it draggable? So Im bit unsure of your motives and makes me weary to answer....

The problem is that the titlebar of Internalframe is there

Well Here is code to remove the titlepane (found it here):

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

and user can drag it around.

And I found this to make JInternalFrame unmovable by removing the MouseListeners which make it movable, but it is important to note its not necessary to remove the MouseListeners as the method used to make it undraggable will remove the NorthPane which the MouseListener is added too thus its unnecessary for us to remove it ourselves.:

//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);
}

And as per your title:

how to make JInternalFrame fill the Container

Simply call setSize(int width,int height) on JInternalFrame with parameters of the JDesktopPanes width and height (JDesktopPane will be sized via overriding getPreferredSize()).

Which will give us this:

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);
    }
}



回答2:


Given your requirements, I suggest you just use a simple JPanel inside your JFrame content pane.



来源:https://stackoverflow.com/questions/14600332/how-to-make-jinternalframe-fill-the-container-and-disable-the-dragging-feature

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!