Java - 如何使一组 JInternalFrame 彼此独立?
我正在编写一个简短的 Paint 程序,例如,我正在尝试为其创建一个 MDI 架构。为了实现这一点,我在 JDesktopPane 中使用了 JInternalFrame。 虽然我获得了多个帧,但并没有真正正常工作。 基本上,如果我有 2 个 JInternalFrame,我只能在最后一个上绘制。另一位似乎已被禁用。
这是说明问题的简短视频。 http://bit.ly/9ydiwM
以下是部分代码。
Panneau.java
public class Panneau extends JDesktopPane
{
/** La liste de fenêtres ouvertes */
private static ArrayList<Cadre> cadres;
/** Le pannel comportant la liste des formes à dessiner*/
private Pannel pannel;
/** La barre d'outils */
private ToolBox toolBox;
public Panneau()
{
this.setLayout(new BorderLayout());
// Initialisations des listes de cadres
cadres = new ArrayList<Cadre>();
// En haut ToolBox
toolBox = new ToolBox();
this.add(toolBox, BorderLayout.NORTH);
**// Intialisation de la première internal frame
Cadre cadre = new Cadre();
this.add(cadre, BorderLayout.CENTER);**
cadres.add(cadre);
// Ajout du pannel à gauche
pannel = new Pannel();
this.add(pannel, BorderLayout.WEST);
}
/**
* Crée une nouvelle fenêtre de dessin
*
*/
**public void createNewInternalFrame()
{
Cadre cadre = new Cadre();
this.add(cadre, BorderLayout.CENTER);
cadres.add(cadre);
}**
}
public class Cadre extends JInternalFrame
{
/** Largeur par d'une fenêtre interne */
private int width;
/** Hauteur d'une fenêtre interne */
private int height;
/** Titre d'une fenêtre interne */
private String title;
/** Toile associée à la fenêtre interne */
private Toile toile;
public Cadre()
{
width = 400;
height = 400;
title = "Form";
toile = new Toile();
this.setTitle(title);
this.setSize(width, height);
this.setEnabled(true);
this.setResizable(true);
this.setAutoscrolls(true);
this.setClosable(true);
this.setIconifiable(true);
this.setDoubleBuffered(true);
this.setContentPane(toile);
this.setVisible(true);
this.pack();
}
}
基本上,Panneau 是包含 GUI 的所有不同部分的主窗口。我可以使用 Panneau.createNewInternalFrame() 创建任意数量的 JInternalFrame。 Toile 基本上是我绘制形状的地方。
有什么想法吗?
谢谢
I'm programming a short Paint program like and I'm trying to make an MDI architecture for it. To make that happen, I used JInternalFrame inside a JDesktopPane.
Although I kind of obtain multiple frames, there are not really working properly.
Basically, if I have 2 JInternalFrame I can draw only on the last one. The other one seems to be disabled.
Here is a short video illustrating the problem.
http://bit.ly/9ydiwM
Here are some part of the code.
Panneau.java
public class Panneau extends JDesktopPane
{
/** La liste de fenêtres ouvertes */
private static ArrayList<Cadre> cadres;
/** Le pannel comportant la liste des formes à dessiner*/
private Pannel pannel;
/** La barre d'outils */
private ToolBox toolBox;
public Panneau()
{
this.setLayout(new BorderLayout());
// Initialisations des listes de cadres
cadres = new ArrayList<Cadre>();
// En haut ToolBox
toolBox = new ToolBox();
this.add(toolBox, BorderLayout.NORTH);
**// Intialisation de la première internal frame
Cadre cadre = new Cadre();
this.add(cadre, BorderLayout.CENTER);**
cadres.add(cadre);
// Ajout du pannel à gauche
pannel = new Pannel();
this.add(pannel, BorderLayout.WEST);
}
/**
* Crée une nouvelle fenêtre de dessin
*
*/
**public void createNewInternalFrame()
{
Cadre cadre = new Cadre();
this.add(cadre, BorderLayout.CENTER);
cadres.add(cadre);
}**
}
public class Cadre extends JInternalFrame
{
/** Largeur par d'une fenêtre interne */
private int width;
/** Hauteur d'une fenêtre interne */
private int height;
/** Titre d'une fenêtre interne */
private String title;
/** Toile associée à la fenêtre interne */
private Toile toile;
public Cadre()
{
width = 400;
height = 400;
title = "Form";
toile = new Toile();
this.setTitle(title);
this.setSize(width, height);
this.setEnabled(true);
this.setResizable(true);
this.setAutoscrolls(true);
this.setClosable(true);
this.setIconifiable(true);
this.setDoubleBuffered(true);
this.setContentPane(toile);
this.setVisible(true);
this.pack();
}
}
Basically, Panneau is the main Window that contains all the differents parts of the GUI. I can create as much JInternalFrame that I want, using : Panneau.createNewInternalFrame().
Toile is basically where I draw my shapes.
Any idea ?
Thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您错误地使用了 JDesktopPane。桌面窗格“不”故意使用布局管理器。这允许您添加多个内部框架并单独拖动它们。
您的类不应该扩展 JDesktopPane,因为您没有向它添加任何新功能。
因此,一般来说,所有逻辑仍应处理 JFrame。也就是说:
a) 您创建工具栏并将其添加到内容窗格的北部。
b) 创建桌面窗格并将其添加到内容窗格的中心
c) 创建内部框架并将它们添加到桌面窗格
阅读 Swing 教程以获取使用内部框架的示例。
You are using the JDesktopPane incorrectly. The desktop pane "does not" use a layout manager on purpose. This allows you to add multiple internal frames and drag them around individually.
Your class should NOT be extending JDesktopPane since you are not adding any new functionality to it.
So in general all you logic should still deal with the JFrame. That is:
a) you create your toolbar and add it to the NORTH of the content pane.
b) you create your desktop pane and add it to the CENTER of the content pane
c) your create your internal frames and and them to the desktop pane
Read the Swing tutorial for examples of using internal frames.
我认为问题在于您覆盖了 BorderLayout 中的中心方向。这样做的结果是,这两个盒子本质上是第二个添加的盒子,这对根本不是为其设计的组件造成了严重破坏。因此,层次结构有两个不同的元素,布局管理器将第二个元素设置为 CENTER 组件,并且布局管理器可能处理相当多的东西。
请注意 BorderLayout 中的以下代码(是的,它已被弃用,但无论如何它都会被未弃用的方法调用):
使用适当的布局管理器来完成这项工作会很酷,但它们并不是为使用 MDI 进行清理而设计的视窗。
I think the problem is that you're overwriting the CENTER orientation in BorderLayout. The effect of this is that the two boxes are essentially the second added box, which plays havoc with the component which simply isn't designed for it. So, the hierarchy has two different elements, and the layout manager has the second element set the CENTER component, and the layout manager probably handles a fair bit of stuff.
Note the following code in BorderLayout (yes, it's deprecated, but it gets called by the non-deprecated method anyway):
It would be cool to use a proper layout manager to do the job, but they aren't designed for mucking with MDI windows.
请参阅如何使用内部框架< /a> 和
InternalFrameDemo
。See How to Use Internal Frames and
InternalFrameDemo
.