爪哇 - 如何使一组相互独立的的JInternalFrame的?(Java - How to mak

2019-10-20 11:35发布

我喜欢编程很短的画图程序,我试图让一个MDI架构它。 要做到这一点,我用的JInternalFrame JDesktopPane中内。 虽然我有点获得多个帧,有没有真正正常工作。 基本上,如果我有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的所有型动物份主窗口。 我可以创造尽可能多的JInternalFrame,我想,使用:Panneau.createNewInternalFrame()。 棉质印花布基本上,我画我的形状。

任何想法 ?

谢谢

Answer 1:

你不正确使用的JDesktopPane。 桌面窗格“不”使用布局管理器的目的。 这使您可以添加多个内部框架和单独拖动他们周围。

你的类不应该被延长的JDesktopPane因为你没有添加任何新功能吧。

所以一般你的逻辑还是应该处理的JFrame。 那是:

A)您创建的工具栏,并将其添加到内容窗格的北面。

b)您创建桌面窗格并将其添加到内容窗格中的中心

c)您创建你的内部框架和与他们的桌面窗格

阅读使用内部帧的例子Swing的教程。



Answer 2:

我认为问题是,你在覆盖BorderLayout的中央定位。 这样做的效果是,两个箱基本上与第二附加箱,起到破坏与根本没有被设计为它的组成部分。 因此,层次结构有两种不同的元素,布局管理器设置中心组件的第二个元素和布局管理器可能处理的东西,公平一点。

注意的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窗口搞混。



Answer 3:

请参阅如何使用内部框架InternalFrameDemo



文章来源: Java - How to make a set of JInternalFrame independant of each other?