Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使JInternalFrame填充容器并禁用拖动功能?_Java_Swing_Jinternalframe - Fatal编程技术网

Java 如何使JInternalFrame填充容器并禁用拖动功能?

Java 如何使JInternalFrame填充容器并禁用拖动功能?,java,swing,jinternalframe,Java,Swing,Jinternalframe,我在做一个项目,大型机里有个JinternalFrame。现在,我们需要让它们成为JFrame。我正在考虑用JFrame固定JInternalFrame。问题是Internalframe的标题栏在那里,用户可以拖动它 有没有办法让内部框架像JFrame中的窗格一样工作? 在互联网上搜索后,我发现有人把标题纸拿走了 你有什么好主意吗 谢谢你 更新: 也许我走错了方向。真正的问题是内部框架无法脱离主框架,或者以任何方式使其看起来像是框架的外部?根据您的要求,我建议您在JFrame内容窗格中使用一个简

我在做一个项目,大型机里有个JinternalFrame。现在,我们需要让它们成为JFrame。我正在考虑用JFrame固定JInternalFrame。问题是Internalframe的标题栏在那里,用户可以拖动它

有没有办法让内部框架像JFrame中的窗格一样工作? 在互联网上搜索后,我发现有人把标题纸拿走了

你有什么好主意吗

谢谢你

更新:
也许我走错了方向。真正的问题是内部框架无法脱离主框架,或者以任何方式使其看起来像是框架的外部?

根据您的要求,我建议您在
JFrame
内容窗格中使用一个简单的
JPanel

有没有办法使内部框架像一个窗格一样工作 JFrame

我不确定你所说的窗格是什么意思,但我想你喜欢
JPanel
?当然你可以,但是为什么,这是我的问题,除非你想要一种快速浮动的面板,但是你说你不想要它可以拖动?所以我有点不确定你的动机,我很难回答

问题是Internalframe的标题栏在那里

下面是删除标题烷(找到它)的代码:

用户可以拖动它

我发现通过移除使其可移动的
鼠标听筒
s,可以使
JInternalFrame
不可移动,但需要注意的是,无需移除
鼠标储物器
s,因为用于使其不可损坏的方法将移除
鼠标储物器
添加的
NorthPane
,因此我们无需自行移除

//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
填充容器

只需使用
JDesktopPane
s
width
height
的参数在
JInternalFrame
上调用
setSize(int-width,int-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);
    }
}


最简单的方法是删除JDesktopPane并用JInternalFrame的内容窗格替换它。没有像
JInternalFrame.setUndecorated()
+1这样的方法,OP需要什么,他/她可以画自己的
边框
,改变背景,使其看起来像
JInternalFrame
,如果他/她想要的是这样的。嗨,我正在尝试将一些JInternalFrame替换为JFrame,因为用户希望将它们从主窗口中拖出。但是JInternalFrame非常复杂,很难将其转换为JFrame。所以我想把它们放到另一个JFrame中会更容易。改造后,效果良好。但用户界面也有问题。一个是我在帖子中描述的。其他可能是从JFrame到其内部JInternalFrame的一些事件转移。也许你对转换有更好的想法?对不起,我不是母语人士,帖子也不清楚。我发现你的答案可能就是我想要的,我会试试看,然后回来。非常感谢。您好,我正在mac机器上运行您的代码,getNorthPane似乎返回null。如何在mac上获取标题栏?是否可以根据JFrame调整JInterFrame的大小?
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);
    }
}