gpt4 book ai didi

java - JDesktopPane 调整大小

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:57:55 25 4
gpt4 key购买 nike

我们有一个包含两个 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;
    }

    注意:删除了 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 位置。

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

希望这有帮助!!!

问候,尼林德拉

关于java - JDesktopPane 调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18487550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com