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 (编辑:鄂州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
