Java - 如何使一组 JInternalFrame 彼此独立?

发布于 2024-08-25 16:10:30 字数 2386 浏览 6 评论 0原文

我正在编写一个简短的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

我只土不豪 2024-09-01 16:10:30

您错误地使用了 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.

寒江雪… 2024-09-01 16:10:30

我认为问题在于您覆盖了 BorderLayout 中的中心方向。这样做的结果是,这两个盒子本质上是第二个添加的盒子,这对根本不是为其设计的组件造成了严重破坏。因此,层次结构有两个不同的元素,布局管理器将第二个元素设置为 CENTER 组件,并且布局管理器可能处理相当多的东西。

请注意 BorderLayout 中的以下代码(是的,它已被弃用,但无论如何它都会被未弃用的方法调用):

/**
 * @deprecated  replaced by <code>addLayoutComponent(Component, Object)</code>.
 */
@Deprecated
public void addLayoutComponent(String name, Component comp) {
  synchronized (comp.getTreeLock()) {
    /* Special case:  treat null the same as "Center". */
    if (name == null) {
        name = "Center";
    }

    /* Assign the component to one of the known regions of the layout.
     */
    if ("Center".equals(name)) {
        center = comp;
    } else if ("North".equals(name)) {
        north = comp;
    } else if ("South".equals(name)) {
        south = comp;
    } else if ("East".equals(name)) {
        east = comp;
    } else if ("West".equals(name)) {
        west = comp;
    } else if (BEFORE_FIRST_LINE.equals(name)) {
        firstLine = comp;
    } else if (AFTER_LAST_LINE.equals(name)) {
        lastLine = comp;
    } else if (BEFORE_LINE_BEGINS.equals(name)) {
        firstItem = comp;
    } else if (AFTER_LINE_ENDS.equals(name)) {
        lastItem = comp;
    } else {
        throw new IllegalArgumentException("cannot add to layout: unknown constraint: " + name);
    }
  }
}

使用适当的布局管理器来完成这项工作会很酷,但它们并不是为使用 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):

/**
 * @deprecated  replaced by <code>addLayoutComponent(Component, Object)</code>.
 */
@Deprecated
public void addLayoutComponent(String name, Component comp) {
  synchronized (comp.getTreeLock()) {
    /* Special case:  treat null the same as "Center". */
    if (name == null) {
        name = "Center";
    }

    /* Assign the component to one of the known regions of the layout.
     */
    if ("Center".equals(name)) {
        center = comp;
    } else if ("North".equals(name)) {
        north = comp;
    } else if ("South".equals(name)) {
        south = comp;
    } else if ("East".equals(name)) {
        east = comp;
    } else if ("West".equals(name)) {
        west = comp;
    } else if (BEFORE_FIRST_LINE.equals(name)) {
        firstLine = comp;
    } else if (AFTER_LAST_LINE.equals(name)) {
        lastLine = comp;
    } else if (BEFORE_LINE_BEGINS.equals(name)) {
        firstItem = comp;
    } else if (AFTER_LINE_ENDS.equals(name)) {
        lastItem = comp;
    } else {
        throw new IllegalArgumentException("cannot add to layout: unknown constraint: " + name);
    }
  }
}

It would be cool to use a proper layout manager to do the job, but they aren't designed for mucking with MDI windows.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文