与JDesktopPane中的桌面快捷方式类似的图标

时间:2016-12-19 13:47:23

标签: java jdesktoppane

我们正在使用 JDesktopPane JInternalFrames 作为我们的软件,我想知道我们是否可以在桌面窗格中放置快捷方式图标(特定框架)(类似于Windows桌面快捷方式)。我搜索了这个,但没有运气。

任何想法的人都能做到这一点?

1 个答案:

答案 0 :(得分:1)

以下是 a" good"解决方案,但对于某些应用案例可能还行。主要的困难是在这里发挥作用的中心类是JInternalFrame.JDesktopIcon,并且该类的文档包含

警告:

  

Swing应用程序不应该使用此API,因为它将在Swing的未来版本中消失,因为它的功能被移动到JInternalFrame中。

但是,JInternalFrame中的相应功能根本就不存在。虽然我必须接受在将来的版本中删除JDesktopIcon ,但考虑到在内部Swing UI实现中广泛使用此类,我似乎不太可能。 / p>

但是:实现此目的的一个选项是创建BasicDesktopIconUI的自定义扩展。幸运的是,这个类可以处理大多数清洁工作,例如拖动支持并在双击时取消对图标的显示。

因此,人们可以轻松地将自定义图标隐藏到这样的实现中(我在这里只使用了占位符:黑色背景上的红叉。但它可以是任意Image。)

Internal Frame Icons

这是在MCVE实现的。一般的UI处理在实际应用程序中可能有所不同,但基本思想是创建自定义UI类并将其分配给内部框架图标。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.LayoutManager;
import java.awt.image.BufferedImage;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.plaf.basic.BasicDesktopIconUI;

class SimpleDesktopIconUI extends BasicDesktopIconUI
{
    private final Icon icon;

    SimpleDesktopIconUI(Icon icon)
    {
        this.icon = icon;
    }

    @Override
    protected void installComponents()
    {
        frame = desktopIcon.getInternalFrame();
        String title = frame.getTitle();

        JLabel label = new JLabel(title, icon, SwingConstants.CENTER);
        label.setVerticalTextPosition(JLabel.BOTTOM);
        label.setHorizontalTextPosition(JLabel.CENTER);

        desktopIcon.setBorder(null);
        desktopIcon.setOpaque(false);
        desktopIcon.setLayout(new GridLayout(1, 1));
        desktopIcon.add(label);
    }

    @Override
    protected void uninstallComponents()
    {
        desktopIcon.setLayout(null);
        desktopIcon.removeAll();
        frame = null;
    }

    @Override
    public Dimension getMinimumSize(JComponent c)
    {

        LayoutManager layout = desktopIcon.getLayout();
        Dimension size = layout.minimumLayoutSize(desktopIcon);
        return new Dimension(size.width + 15, size.height + 15);
    }

    @Override
    public Dimension getPreferredSize(JComponent c)
    {
        return getMinimumSize(c);
    }

    @Override
    public Dimension getMaximumSize(JComponent c)
    {
        return getMinimumSize(c);
    }
}

public class InternalFrameIconTest
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(() -> createAndShowGUI());
    }

    private static void createAndShowGUI()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Icon icon = new ImageIcon(createImage());

        JDesktopPane desktopPane = new JDesktopPane();

        for (int i = 0; i < 5; i++)
        {
            String title = "Test " + i;
            if (i == 2)
            {
                title = "Test 2 with longer title";
            }
            JInternalFrame internalFrame =
                new JInternalFrame(title, true, true, true, true);
            internalFrame.setBounds(20 + 50 * i, 300 - 40 * i, 160, 80);
            internalFrame.setVisible(true);
            desktopPane.add(internalFrame);

            internalFrame.getDesktopIcon().setUI(new SimpleDesktopIconUI(icon));
        }

        f.getContentPane().add(desktopPane);
        f.setSize(600, 600);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    private static BufferedImage createImage()
    {
        int w = 50;
        int h = 50;
        BufferedImage image =
            new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = image.createGraphics();
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, w, h);
        g.setColor(Color.RED);
        g.drawLine(0, 0, w, h);
        g.drawLine(0, h, w, 0);
        g.dispose();
        return image;
    }
}