JDesktopPane 调整大小

2024-01-10

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

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

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)调整第一个窗口的大小

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

更新:添加更多信息

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


该问题是由于 Java 7 对 javax.swing.plaf.basic.BasicInternalFrameUI 实现的调整造成的。

  • Java 1.6 代码

    公共无效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 代码

    公共无效propertyChange(PropertyChangeEvent evt){

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

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

我建议你有2个选择:

  • 选项一

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

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

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

希望这可以帮助!!!

问候, 尼林德拉

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JDesktopPane 调整大小 的相关文章

随机推荐

  • 无法在 Spring4D 中使用带有比较器的默认参数值

    我不确定这是否是一些通用问题 还是因为 Spring4D 实现 但我不能使用默认参数值来创建比较器 type TMyClass class class function MyComparer AParam Boolean False ICo
  • 在 Laravel Eloquent 模型中创建动态命名的变体

    我有一个日期字段列表 所有这些字段的变异器都有相同的逻辑 我想将此功能提取到一个特征中 以便将来我需要的只是在模型中创建一个日期字段数组并使用该特征 像这样的事情 foreach dates as date dateCamelCase th
  • 从 Maven 运行 Gradle

    我正在寻找一些 Maven 的 Gradle 执行器插件 类似于 Maven ant run 插件 谷歌没有提供帮助 难道这样的插件不存在吗 我应该尝试这个 https github com if6was9 gradle maven plu
  • 实现docker容器按需启动

    情况 大量重型 docker 容器会在一段时间内定期受到攻击 然后在较长时间内保持未使用状态 希望 按需启动容器 就像 systemd 通过套接字激活启动容器一样 并在空闲一段时间后停止它们 不visible最终用户的停机时间 Option
  • 忘记是行不通的

    如果我尝试从此集合中删除某个项目 examples Example where example data example gt get 通过做 examples gt forget 20 它不会从集合中删除该项目 我仍然取回原来存在的所有项
  • 如何将自定义 Java 类转换为 Spark 数据集

    我无法找到将测试对象列表转换为 Spark 中的数据集的方法 这是我的课 public class Test public String a public String b public Test String a String b thi
  • Brave/Chrome 浏览器中图像周围出现不需要的边框半径角

    我尝试在容器内显示一个简单的图像border radius 5px 但角落处似乎有一个细边框的轮廓 您需要仔细查看下图 如何避免这些角边框 cover margin 1em padding 1em image wrapper height
  • 如何从 Android 删除 Firestore 集合

    Issue 我正在寻找一个临时解决方案来从客户端删除集合以进行概念证明 我最终将按照建议将其重构到服务器上 我添加了删除所有特定 Firestore 用户帐户信息的功能 包括他们在应用程序中保存的内容集合 根据Firestore 文档 ht
  • 标识符 int 不是 struct SOCKET_LOG_DATA 的直接成员

    当我编译以下结构时 typedef PACKED struct PACKED SUFFIX SOCKET LOG DATA typedef PACKED union PACKED SUFFIX PACKED struct PACKED SU
  • Swift 中的条件删除集合的最后一个元素

    我正在尝试删除 从字符串数组的后面直到最后一项包含一些文本 但我的实现没有实现 到目前为止我的实现 var array A B C D while true if array last array last array removeLast
  • Django i18n 不起作用

    我正在尝试为我的项目激活不同的语言 现在有英语和西班牙语 我将描述我遵循的所有步骤 首先 我将自己置于要翻译的目录中 或者更好地说 所有 trans 标签都是 cd media templates landing mkdir locale
  • Javascript e.preventDefault();不适用于提交()

    我在使用 javascript 提交表单时遇到问题submit 现场录制 https jsfiddle net 98sm3f3t https jsfiddle net 98sm3f3t HTML
  • 从 JPanel 中完全删除 JLabel...而不是 setVisible(False)

    我有一个相当简单的问题 我在 JFrame 上有一个 JPanel 我在 JPanel 上有一个 JLabel 我想知道如何在运行时从 JPanel 中完全删除 JLabel ImageIcon image7 new ImageIcon a
  • C++,DLL的多个实例,单例

    我有一个 DLL 其中定义了单例 我有一个可以加载此 DLL 的多个实例的应用程序 DLL 需要每个 DLL 实例有一个单例实例 否则会崩溃 我发现多个 DLL 实例只有一个单例实例 为什么 我怎样才能解决它 如果可能的话 不将单例重构为其
  • Linq orderby 文化(丹麦语、æøå)

    我的 orderby linq 表达式有问题 它以错误的顺序生成输出 我来自丹麦 正在创建一个丹麦网站 因此订单必须准确无误 这是我的查询 var model from w in db News orderby w Title select
  • 与列表相比,生成器多次迭代的速度

    我预计在多个循环的情况下列表迭代将比使用生成器快得多 而我的代码表明这是错误的 我的理解是 通过操作我指的是定义元素的任何表达式 一个清单需要n待初始化的操作 但列表上的每个循环只是从内存中获取一个元素 thus m循环列表只需要n运营 生
  • 如何添加 HTML 哈希链接而不改变 URL 栏...?

    当我将 HTML 链接添加到页面的特定部分时 a href specific test a 我注意到它改变了地址栏上的 URL 尽管我遇到过以这种方式链接的网站 但地址栏没有更新 这怎么可能 编辑 这可能是一个 AJAX 解决方案 如果他们
  • 如何在小米手机上以编程方式启用“在锁定屏幕上显示”权限[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 How can I enable show on lock screen permission on Xiaomi phones Is it
  • SVG TextPath 文本显示颠倒

    下面是颠倒显示路径上文本的 SVG 代码 请帮助说明如何正确显示它的正面
  • JDesktopPane 调整大小

    我们有一个具有两个 JFrame 和两个 JDesktopPanes 的应用程序 我们需要将内部框架从一个框架移动到另一个框架 我们遇到的问题是 将内部框架从第一个窗口移动到第二个窗口后 当我们调整第一个窗口的大小时 第二个窗口的内部框架也