JDesktopPane 调整大小 [英] JDesktopPane resize

查看:38
本文介绍了JDesktopPane 调整大小的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们有一个包含两个 JFrame 和两个 JDesktopPanes 的应用程序.我们需要将一个内部框架从一个框架移动到另一个框架.

We have a application with two JFrames with two JDesktopPanes. We need to move an internal frame from one frame to another.

我们遇到的问题是,当我们将第一个窗口的内部框架移动到第二个窗口后,当我们调整第一个窗口的大小时,第二个窗口的内部框架也被调整大小.

The problem we have is that after we move the internalframe from first window to the second window, when we resize the fist window, the internal frame of the second window also gets resized.

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyVetoException;

import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

class FirstFrame extends JFrame
{
  JDesktopPane desktopPane = new JDesktopPane();

  SecondFrame secondFrame;

  public FirstFrame(SecondFrame secondFrame)
  {
    this.secondFrame = secondFrame;
    setTitle("FirstFrame example");
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    add(desktopPane);

    JMenuBar menuBar = new JMenuBar();
    JMenu menu = new JMenu("File");
    JMenuItem item = new JMenuItem("Move");

    item.addActionListener(new ActionListener()
    {

      @Override
      public void actionPerformed(ActionEvent actionevent)
      {
        moveFrame();
      }
    });

    menu.add(item);
    menuBar.add(menu);
    setJMenuBar(menuBar);

  }

  public void addAnInternalFrame()
  {
    JInternalFrame frame = new JInternalFrame();
    frame.setTitle("An Internal Frame");

    desktopPane.add(frame);
    frame.setVisible(true);
    frame.setMaximizable(true);
    try
    {
      frame.setSelected(true);
      frame.setMaximum(true);
    }
    catch (PropertyVetoException e)
    {
      e.printStackTrace();
    }

  }

  public void moveFrame()
  {
    JInternalFrame selectedFrame = desktopPane.getSelectedFrame();
    desktopPane.remove(selectedFrame);
    desktopPane.repaint();

    secondFrame.addInternalFrame(selectedFrame);
  }
}

class SecondFrame extends JFrame
{
  JDesktopPane desktopPane = new JDesktopPane();

  public SecondFrame()
  {
    setTitle("SecondFrame example");
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    add(desktopPane);
  }

  public void addInternalFrame(JInternalFrame frame)
  {
    desktopPane.add(frame);
  }
}

public class DesktopPaneExample
{
  public static void main(String args[]) throws PropertyVetoException
  {

    SecondFrame secondFrame = new SecondFrame();

    FirstFrame firstFrame = new FirstFrame(secondFrame);

    firstFrame.setSize(400, 400);
    firstFrame.setLocation(100, 100);
    firstFrame.setVisible(true);
    firstFrame.addAnInternalFrame();

    secondFrame.setSize(400, 400);
    secondFrame.setLocation(520, 100);
    secondFrame.setVisible(true);




  }
}

在上面的示例应用程序中,要重现1) 点击菜单文件>移动2) 调整第一个窗口的大小

In the above sample application, to reproduce 1) click menu File>move 2) resize the first window

注意:这只能在 Java 1.7 中重现.我用的是jdk1.7.0_03.

NOTE: This is reproducable in Java 1.7 only. I use jdk1.7.0_03.

这在 Java 1.6 (jdk1.6.0_21) 上无法重现

This was not reproducible on Java 1.6 (jdk1.6.0_21)

推荐答案

这个问题是由于 Java 7 对 javax.swing.plaf.basic.BasicInternalFrameUI 实现的调整.

The issue is due to Java 7's tweaking on javax.swing.plaf.basic.BasicInternalFrameUI implementation.

  • Java 1.6 代码

  • Java 1.6 Code

public void propertyChange(PropertyChangeEvent evt) {

public void propertyChange(PropertyChangeEvent evt) {

        if ((frame.getParent() != null) && !componentListenerAdded) {
            f.getParent().addComponentListener(componentListener);
            componentListenerAdded = true;
        } else if ((newValue == null) && componentListenerAdded) {
            if (f.getParent() != null) {
                f.getParent()
                        .removeComponentListener(componentListener);
            }
            componentListenerAdded = false;
        }

  • Java 1.7 代码

  • Java 1.7 Code

    public void propertyChange(PropertyChangeEvent evt) {

    public void propertyChange(PropertyChangeEvent evt) {

            if ((frame.getParent() != null) && !componentListenerAdded) {
                f.getParent().addComponentListener(componentListener);
                componentListenerAdded = true;
            }
    

    注意:else if 条件已删除.这是罪魁祸首.

    我建议你两个选择:

    • 选项一

    JInternalFrame selectedFrame = desktopPane.getSelectedFrame();
    desktopPane.remove(selectedFrame);
    desktopPane.repaint();
    
    secondFrame.updateUI(); // The magic part, less expensive execution.
    
    secondFrame.addInternalFrame(selectedFrame);
    

  • 选项二

  • Option two

    您可能需要使用上述else if"条件重新编译 javax.swing.plaf.basic.BasicInternalFrameUI.java 并添加到您的 rt.jar 库的 javax.swing.plaf.basic 位置.

    You may need to recompile javax.swing.plaf.basic.BasicInternalFrameUI.java with above "else if" condition and add to your rt.jar library's javax.swing.plaf.basic location.

    我在 http://www.datafilehost.com/附上了 Java 1.7.0_25 的重新编译文件d/dfb7238c

    希望这有帮助!!!

    问候,尼琳德拉

    这篇关于JDesktopPane 调整大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

  • 查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆