gpt4 book ai didi

java - JDesktopPane - 最小化 JInternalFrames

转载 作者:行者123 更新时间:2023-12-01 14:12:06 25 4
gpt4 key购买 nike

我使用 JDesktopPane 并创建多个 JInternalFrame 对象。当我最小化所有框架并最大化其中任何一个框架时,打开的框架会覆盖所有最小化的框架。

如何使所有最小化的框架可见?

最佳答案

默认情况下,内部框架最大化以占据桌面的所有空间。通过自定义 DesktopManager 来更改此行为相对容易。例如:

import java.awt.*;
import javax.swing.*;
import java.beans.PropertyVetoException;

class MaximizeDesktopManager extends DefaultDesktopManager
{
@Override
public void maximizeFrame(JInternalFrame f)
{
if (f.isIcon())
{
try
{
// In turn calls deiconifyFrame in the desktop manager.
// That method will handle the maximization of the frame.
f.setIcon(false);
}
catch (PropertyVetoException e2) {}
}
else
{
f.setNormalBounds(f.getBounds());
// Rectangle desktopBounds = f.getParent().getBounds();
Rectangle desktopBounds = getDesktopBounds(f);
setBoundsForFrame(f, 0, 0, desktopBounds.width, desktopBounds.height);
}

// Set the maximized frame as selected.
try
{
f.setSelected(true);
}
catch (PropertyVetoException e2) {}
}

private Rectangle getDesktopBounds(JInternalFrame frame)
{
Rectangle desktopBounds = frame.getParent().getBounds();

for (Component c: frame.getParent().getComponents())
{
if (c instanceof JInternalFrame.JDesktopIcon)
{
desktopBounds.height = Math.min(desktopBounds.height, c.getLocation().y);
}
}

return desktopBounds;
}

private static void createAndShowUI()
{
JDesktopPane desktop = new JDesktopPane();
desktop.setDesktopManager( new MaximizeDesktopManager() );

desktop.add( createInternalFrame(1, Color.RED) );
desktop.add( createInternalFrame(2, Color.GREEN) );
desktop.add( createInternalFrame(3, Color.BLUE) );

JFrame frame = new JFrame("Maximize Desktop Manager");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( desktop );
frame.setSize(600, 600);
frame.setLocationRelativeTo( null );
frame.setVisible( true );

// Activate first internal frame

try
{
JInternalFrame[] frames = desktop.getAllFrames();
frames[0].setSelected(true);
}
catch (java.beans.PropertyVetoException e) {}
}

private static JInternalFrame createInternalFrame(int number, Color background)
{
JInternalFrame internal =
new JInternalFrame( "Frame" + number, true, true, true, true );
internal.setBackground( background );
internal.setVisible( true );
int location = 50 * number;
internal.setBounds(location, location, 300, 300);
return internal;
}

public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}

}

不幸的是,如果您调整框架大小,则内部框架的边界将重新调整以再次匹配桌面 Pane 的边界。执行此操作的逻辑位于 BasicInternalFrameUI 中:

/** Invoked when a JInternalFrame's parent's size changes. */
public void componentResized(ComponentEvent e) {
// Get the JInternalFrame's parent container size
Rectangle parentNewBounds = ((Component) e.getSource()).getBounds();
JInternalFrame.JDesktopIcon icon = null;

if (frame != null) {
icon = frame.getDesktopIcon();
// Resize the internal frame if it is maximized and relocate
// the associated icon as well.
if (frame.isMaximum()) {
frame.setBounds(0, 0, parentNewBounds.width,
parentNewBounds.height);
}
}

此逻辑位于 UI 的私有(private)内部类中,因此不容易更改。至少我不知道该怎么做。

关于java - JDesktopPane - 最小化 JInternalFrames,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18433475/

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