java – JDesktopPane调整大小

前端之家收集整理的这篇文章主要介绍了java – JDesktopPane调整大小前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们有一个应用程序与两个JFrames与两个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代码

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代码

public void propertyChange(PropertyChangeEvent evt){

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

注意:否则条件已被删除.这是罪魁祸首.

我建议你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位置.

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

希望这可以帮助!!!

问候,Nilindra

猜你在找的Java相关文章