1

のような短いペイント プログラムをプログラミングしており、そのための MDI アーキテクチャを作成しようとしています。これを実現するために、JDesktopPane 内で JInternalFrame を使用しました。複数のフレームを取得していますが、実際には正しく動作していません。基本的に、2 つの JInternalFrame がある場合、最後のフレームにのみ描画できます。もう1つは無効になっているようです。

問題を説明する短いビデオを次に示します。 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 を作成できます。トワルは基本的に自分の形を描くところです。

何か案が ?

ありがとう

4

3 に答える 3

4

JDesktopPane を正しく使用していません。デスクトップ ペインは、意図的にレイアウト マネージャーを「使用しません」。これにより、複数の内部フレームを追加して、それらを個別にドラッグできます。

クラスに新しい機能を追加するわけではないため、クラスで JDesktopPane を拡張しないでください。

したがって、一般に、すべてのロジックは引き続き JFrame を処理する必要があります。あれは:

a) ツールバーを作成し、コンテンツ ペインの NORTH に追加します。

b) デスクトップ ペインを作成し、それをコンテンツ ペインの中央に追加します。

c)内部フレームを作成し、それらをデスクトップペインに追加します

内部フレームの使用例については、Swing チュートリアルを参照してください。

于 2010-03-20T03:25:21.907 に答える
2

問題は、BorderLayoutのCENTER方向を上書きしていることだと思います。これの効果は、2つのボックスが本質的に2番目に追加されたボックスであり、単にそのために設計されていないコンポーネントに大混乱をもたらすことです。したがって、階層には2つの異なる要素があり、レイアウトマネージャーにはCENTERコンポーネントを設定する2番目の要素があり、レイアウトマネージャーはおそらくかなりの量を処理します。

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ウィンドウをいじくり回すようには設計されていません。

于 2010-03-20T01:39:56.387 に答える
0

内部フレームの使用方法およびを参照してくださいInternalFrameDemo

于 2010-03-20T05:11:48.667 に答える