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