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);
  }
} 
 在上述示例应用程序中,进行复制 注意:这只能在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 (编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  
