如何使JInternalFrame的填充容器和禁用拖动功能?(how to make JIntern

2019-07-19 00:28发布

我工作的一个项目,也有在大型机JInternalFrames。 现在,我们需要让他们成为JFrame中。 我使用一个JFrame留住JInternalFrame的考虑。 问题是,Internalframe的标题栏是存在的,并且用户可以通过拖动它周围。

有没有什么办法,使内部框架的工作就像在JFrame的窗格? 在互联网上搜索后,我发现有人删除titlepane。

你对此有什么好办法?

谢谢!

更新:也许我是在错误的轨道上。 真正的问题是JInternal框架出不来主框架,或任何方式,使它看起来就像是从框架侧的?

Answer 1:

有没有什么办法,使内部框架的工作就像在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 S的,使其可移动,但要注意它没有必要去除是很重要MouseListener S作为所使用的方法,使之undraggable将删除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与参数JDesktopPane小号widthheightJDesktopPane将通过重写的尺寸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);
    }
}


Answer 2:

鉴于你的要求,我建议你只使用一个简单JPanel你里面JFrame的内容窗格。



文章来源: how to make JInternalFrame fill the Container and disable the dragging feature?