Java - 调整 JInternalFrame 大小时出现问题

发布于 2024-08-26 10:03:22 字数 4010 浏览 11 评论 0原文

上一个问题,我正在谈论处理我的 MDI 架构的一些问题。我现在在调整 JInternalFrame 大小时遇到​​另一个问题。这是一个短视频 这说明了这一点。

我有一个类:Cadre,它基本上是我的 JInternalFrame。

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;

 /** Permet de compter le nombre de fenêtres internes ouvertes */
 static int frameCount = 0;
 
 /** Permet de décaler les fenêtres internes à l'ouverture */
 static final int xDecalage = 30, yDecalage = 30;

 
 public Cadre()
 {

  super("Form # " + (++frameCount),
            true, //resizable
            true, //closable
            true, //maximizable
            true);//iconifiable
  
  // Taille de la fenêtre interne par défaut
  width = 500;
  height = 500;
  
  // Titre par défaut
  title = "Form # " + (frameCount);
  
  // On associe une nouvelle toile à la fenêtre
  toile = new Toile();
  this.setContentPane(toile);
  
  // On spécifie le titre
  this.setTitle(title);
  
  // Taille de chaque form par défaut
  this.setSize(width, height);
  
  // Permet d'ouvrir les frames de manière décalée par rapport à la dernière ouverte
  this.setLocation(xDecalage * frameCount, yDecalage * frameCount);
  

 }
}

这是包含所有 JInternalFrame 的 JFrame:

public class Fenetre extends JFrame
{
 /** Titre de la fenêtre principale */
 private String title;
 
 /** Largeur de la fenêtre */
 private int width;
 
 /** Hauteur de la fenêtre */
 private int height;
 
 /** Le menu */
 private Menu menu;
 
 /** La barre d'outils */
 private ToolBox toolBox;
 
 /** La zone contenant les JInternalFrame */
 private JDesktopPane planche;
 
 /** Le pannel comportant la liste des formes à dessiner*/
 private Pannel pannel;
 
 /** La liste de fenêtres ouvertes */
 private static ArrayList<Cadre> cadres;
 
 
 public Fenetre(String inTitle, int inWidth, int inHeight)
 {

  // lecture de la taille de la frame
  width = inWidth;
  height = inHeight;
  
  // lecture du titre de la fenêtre
  title = inTitle;
  
  // On spécifie la taille de la fenêtre ainsi que le titre
  this.setSize(width, height);
  this.setTitle(title);
  
  // Initialisations des listes de cadres
  cadres = new ArrayList<Cadre>();
  
  // Instanciation de la fenêtre
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  
  // On définit un layout pour notre frame
  this.setLayout(new BorderLayout());
  
  // On crée la zone supérieure : Menu + ToolBar
  JPanel banniere = new JPanel();
  banniere.setLayout(new BorderLayout());
  
  // Instanciation d'un menu
  menu = new Menu(this);
  this.setJMenuBar(menu);
  
  // En haut la ToolBox
  toolBox = new ToolBox();
  this.add(toolBox, BorderLayout.NORTH);
  
  // Ajout du pannel à gauche
  pannel = new Pannel();
  this.add(pannel, BorderLayout.WEST);
 
  **// Intialisation de la planche de dessin
  planche = new JDesktopPane();
  
  // On ajoute une Internal frame à notre desktop pane
  Cadre cadre = new Cadre();
  cadre.setVisible(true);
  planche.add(cadre);
  try {
   cadre.setSelected(true);
  } 
  
  catch (PropertyVetoException e) {
   
   e.printStackTrace();
  }**
  
  // Pour faire en sorte que le déplacement soit "nice"
  planche.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
  
  // On ajoute le nouveau cadre crée à la liste des cadres
  cadres.add(cadre);
  
  // Le contenu principal de la fenêtre est la planche contenant les différentes JInternalFrame
  this.getContentPane().add(planche);
  
  this.setVisible(true);  
 }
}

如您所见,我在应用程序的主 JFrame 内声明了一个:JDesktopPane。

知道如何解决这个问题吗?

谢谢你!

In a previous SO question, I was talking about somes issues dealing with my MDI architecture. I have now another problem when resizing my JInternalFrame. Here is a short video that illustrates it.

I have a class: Cadre which is basically my JInternalFrame.

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;

 /** Permet de compter le nombre de fenêtres internes ouvertes */
 static int frameCount = 0;
 
 /** Permet de décaler les fenêtres internes à l'ouverture */
 static final int xDecalage = 30, yDecalage = 30;

 
 public Cadre()
 {

  super("Form # " + (++frameCount),
            true, //resizable
            true, //closable
            true, //maximizable
            true);//iconifiable
  
  // Taille de la fenêtre interne par défaut
  width = 500;
  height = 500;
  
  // Titre par défaut
  title = "Form # " + (frameCount);
  
  // On associe une nouvelle toile à la fenêtre
  toile = new Toile();
  this.setContentPane(toile);
  
  // On spécifie le titre
  this.setTitle(title);
  
  // Taille de chaque form par défaut
  this.setSize(width, height);
  
  // Permet d'ouvrir les frames de manière décalée par rapport à la dernière ouverte
  this.setLocation(xDecalage * frameCount, yDecalage * frameCount);
  

 }
}

And this is the JFrame that contains all the JInternalFrame(s):

public class Fenetre extends JFrame
{
 /** Titre de la fenêtre principale */
 private String title;
 
 /** Largeur de la fenêtre */
 private int width;
 
 /** Hauteur de la fenêtre */
 private int height;
 
 /** Le menu */
 private Menu menu;
 
 /** La barre d'outils */
 private ToolBox toolBox;
 
 /** La zone contenant les JInternalFrame */
 private JDesktopPane planche;
 
 /** Le pannel comportant la liste des formes à dessiner*/
 private Pannel pannel;
 
 /** La liste de fenêtres ouvertes */
 private static ArrayList<Cadre> cadres;
 
 
 public Fenetre(String inTitle, int inWidth, int inHeight)
 {

  // lecture de la taille de la frame
  width = inWidth;
  height = inHeight;
  
  // lecture du titre de la fenêtre
  title = inTitle;
  
  // On spécifie la taille de la fenêtre ainsi que le titre
  this.setSize(width, height);
  this.setTitle(title);
  
  // Initialisations des listes de cadres
  cadres = new ArrayList<Cadre>();
  
  // Instanciation de la fenêtre
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  
  // On définit un layout pour notre frame
  this.setLayout(new BorderLayout());
  
  // On crée la zone supérieure : Menu + ToolBar
  JPanel banniere = new JPanel();
  banniere.setLayout(new BorderLayout());
  
  // Instanciation d'un menu
  menu = new Menu(this);
  this.setJMenuBar(menu);
  
  // En haut la ToolBox
  toolBox = new ToolBox();
  this.add(toolBox, BorderLayout.NORTH);
  
  // Ajout du pannel à gauche
  pannel = new Pannel();
  this.add(pannel, BorderLayout.WEST);
 
  **// Intialisation de la planche de dessin
  planche = new JDesktopPane();
  
  // On ajoute une Internal frame à notre desktop pane
  Cadre cadre = new Cadre();
  cadre.setVisible(true);
  planche.add(cadre);
  try {
   cadre.setSelected(true);
  } 
  
  catch (PropertyVetoException e) {
   
   e.printStackTrace();
  }**
  
  // Pour faire en sorte que le déplacement soit "nice"
  planche.setDragMode(JDesktopPane.OUTLINE_DRAG_MODE);
  
  // On ajoute le nouveau cadre crée à la liste des cadres
  cadres.add(cadre);
  
  // Le contenu principal de la fenêtre est la planche contenant les différentes JInternalFrame
  this.getContentPane().add(planche);
  
  this.setVisible(true);  
 }
}

So as you can see, I have declared a: JDesktopPane inside the main JFrame of my application.

Any idea how to solve this?

Thank you!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(1

很酷不放纵 2024-09-02 10:03:22

正如我在上一篇文章中告诉您的那样,仅仅为了设置该组件的属性而不断扩展组件并不是一个好的编程实践。除非您向类添加新功能,否则不要扩展它。

您发布的代码对我们没有帮助,因为它不可编译。

同样,Swing 教程有一个如何使用内部框架的工作示例。因此,将您的代码与教程进行比较,看看有什么不同。这意味着从一个简单的内部框架开始,里面没有任何组件,只有一个面板,然后看看尺寸是否合适。一旦您获得一个简单的框架,然后将自定义面板添加到其中,看看它是否仍然可以工作。隔离您所做的更改的想法导致了问题。我们无法为您做到这一点。

我注意到的一件事是您正在使用类调用菜单。这是一个 AWT 类,不应在 Swing 应用程序中使用。使用 JMenu 类。

如果您需要更多帮助,请发布说明问题的 SSCCE

As I told you in your last posting, it is NOT a good programming practice to keep extending component just to set properties of that component. Unless you add new functionality to a class don't extend it.

The code you posted doesn't help us because it is not compileable.

Again, the Swing tutorial has a working example of how to use internal frames. So compare your code with the tutorial to see whats different. This means start with a simple internal frame that has no components in it, just a panel and see if the size works. Once you get a simple frame working, then you add your custom panel to it and see if it still works. The idea it to isolate which change you made is causing the problem. We can't do that for you.

One thing I did notice is that you are using a class call Menu. That is an AWT class and should NOT be used in a Swing application. Use the JMenu class.

If you need more help post your SSCCE that demonstrates the problem.

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