Java - Как сделать набор JInternalFrame независимым друг от друга?
Я программирую короткую программу Paint и пытаюсь создать для нее архитектуру 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 - это главное окно, которое содержит все различные части графического интерфейса. Я могу создать столько JInternalFrame, сколько захочу, используя: Panneau.createNewInternalFrame(). Туалеты в основном, где я рисую свои формы.
Любая идея?
Спасибо
3 ответа
Вы используете JDesktopPane неправильно. Панель рабочего стола "не" специально использует менеджер макета. Это позволяет добавлять несколько внутренних рамок и перетаскивать их по отдельности.
Ваш класс НЕ ДОЛЖЕН расширять JDesktopPane, поскольку вы не добавляете в него никаких новых функций.
В общем, вся ваша логика должна все еще иметь дело с JFrame. То есть:
а) вы создаете свою панель инструментов и добавляете ее к СЕВЕРУ панели содержимого.
б) вы создаете панель рабочего стола и добавляете ее в ЦЕНТР панели содержимого
в) вы создаете свои внутренние фреймы и их на панели рабочего стола
Прочитайте учебник Swing для примеров использования внутренних фреймов.
Я думаю, проблема в том, что вы перезаписываете ориентацию CENTER в 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.
Посмотрите, как использовать внутренние рамки и InternalFrameDemo
,