JDesktopPane的 - 减少JInternalFrames(JDesktopPane - m

2019-10-30 02:23发布

我有工作JDesktopPane和创建多个JInternalFrame对象。 当我最小化所有并最大化它们中的任何一个,打开的框架覆盖所有最小化的框架。

如何使所有最小化帧可见?

Answer 1:

默认情况下,内部框架最大化采取桌面的所有空间。 此行为是改变相对容易通过自定义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();
            }
        });
    }

}

不幸的是,如果你调整框架,那么内部框架的边界被重新调整为一致,通过桌面窗格的边界。 做这个逻辑是在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的发现,所以它不会轻易改变。 至少我不知道该怎么做。



文章来源: JDesktopPane - minimising JInternalFrames