问题描述
我使用 JDesktopPane
并创建了多个 JInternalFrame
对象.当我最小化所有并最大化其中任何一个时,打开的框架覆盖了所有最小化的框架.
I working with JDesktopPane
and creating multiple JInternalFrame
objects. When I minimize all and maximize any one of them, the opened frame covers all minimized frames.
如何使所有最小化的帧可见?
How to make all minimized frames visible?
推荐答案
默认情况下,内部框架最大化以占据桌面的所有空间.通过自定义 DesktopManager
来更改此行为相对容易.例如:
By default the internal frame is maximized to take all the space of the desktop. This behaviour is relatively easy by change by customizing the DesktopManager
. For example:
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();
}
});
}
}
不幸的是,如果您调整框架的大小,则内部框架的边界会重新调整以再次匹配桌面窗格的边界.执行此操作的逻辑在 BasicInternalFrameUI 中:
Unfortunately if you resize the frame, then the bounds of the internal frame are readjusted to match the bounds of the desktop pane again. The logic that does this is in the 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 的私有内部类中,因此不容易更改.至少我不知道该怎么做.
This logic is found in a private internal class of the UI so it will not be easy to change. At least I don't know how to do it.
这篇关于JDesktopPane - 最小化 JInternalFrames的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!