首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JDesktopPane调整尺寸

JDesktopPane调整尺寸
EN

Stack Overflow用户
提问于 2013-08-28 12:12:20
回答 2查看 1.8K关注 0票数 10

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

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

代码语言:javascript
复制
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)单击菜单File>move 2)调整第一个窗口的大小

注意:这仅在Java1.7中是可复制的。我用jdk1.7.0_03。

更新:添加更多信息

这在Java1.6 (jdk1.6.0_21)上是不可复制的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-02 07:04:21

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

  • Java 1.6代码 公开无效propertyChange(PropertyChangeEvent evt) { if (( f.getParent().addComponentListener(componentListener);()) !=空)& ! componentListenerAdded ) {frame.getParent componentListenerAdded= true;} else if ((newValue == null) & componentListenerAdded) { if (f.getParent() = null) { f.getParent() .removeComponentListener(componentListener);} componentListenerAdded = false;}
  • Java 1.7代码 公开无效propertyChange(PropertyChangeEvent evt) { if ( f.getParent().addComponentListener(componentListener);()) != null) & ! componentListenerAdded ) {frame.getParent componentListenerAdded= true;} 注意:其他的if条件被删除了。这就是罪魁祸首,

我建议你有两个选择:

  • 备选方案一 JInternalFrame selectedFrame = desktopPane.getSelectedFrame();desktopPane.remove(selectedFrame);desktopPane.repaint();secondFrame.updateUI();//魔术部分,成本较低。secondFrame.addInternalFrame(selectedFrame);
  • 备选案文二

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

我已经在http://www.datafilehost.com/d/dfb7238c上为Java http://www.datafilehost.com/d/dfb7238c附加了重新编译的文件

希望这会有帮助!

你好,Nilindra

票数 4
EN

Stack Overflow用户

发布于 2013-08-28 13:45:23

似乎在帧处于最大状态时添加帧是罪魁祸首。要保持第一帧到第二帧的当前大小,请尝试如下:

代码语言:javascript
复制
public void moveFrame()
{
  JInternalFrame selectedFrame = desktopPane.getSelectedFrame();
  Dimension currentSize = selectedFrame.getSize();
  try
  {
    selectedFrame.setMaximum(false);
  }
  catch (PropertyVetoException ex)
  {
    ex.printStackTrace();
  }
  selectedFrame.setSize(currentSize);

  desktopPane.remove(selectedFrame);
  desktopPane.repaint();
  secondFrame.addInternalFrame(selectedFrame);
}

编辑:

在阅读了Container#remove(Component c)的API之后,我得到了一个似乎可行的想法:

代码语言:javascript
复制
public void moveFrame()
{
  final JInternalFrame selectedFrame = desktopPane.getSelectedFrame();

  desktopPane.remove(selectedFrame);
  desktopPane.repaint();
  SwingUtilities.updateComponentTreeUI(selectedFrame);

  SwingUtilities.invokeLater(new Runnable()
  {
    public void run()
    {
      secondFrame.addInternalFrame(selectedFrame);
    }
  });
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18487550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档