gpt4 book ai didi

java - JDesktopPane 中类似于桌面快捷方式的图标

转载 作者:行者123 更新时间:2023-11-30 06:59:15 24 4
gpt4 key购买 nike

由于我们在软件中使用 JDesktopPaneJInternalFrames ,我想知道我们是否可以将快捷图标(特定框架)放置在桌面 Pane 内(类似于Windows 桌面快捷方式)。我搜索了这个但没有运气。

大家有什么想法可以实现这一点吗?

最佳答案

以下不是一个“好的”解决方案,但对于某些应用案例来说可能还不错。主要的困难是这里发挥作用的中心类是 JInternalFrame.JDesktopIcon ,并且该类的文档包含

警告:

This API should NOT BE USED by Swing applications, as it will go away in future versions of Swing as its functionality is moved into JInternalFrame.

但是,JInternalFrame 中根本不存在相应的功能。尽管人们必须接受 JDesktopIcon可能在未来版本中被删除,但考虑到该类在内部 Swing UI 中的广泛使用,这对我来说似乎不太可能实现。

但是:实现此目的的一种选择是创建 BasicDesktopIconUI 的自定义扩展。幸运的是,此类处理大部分清洁工作,例如拖动支撑和双击时取消框架图标。

因此,人们可以轻松地将自定义图标潜入这样的实现中(我在这里只使用了一个占位符:黑色背景上的红十字。但它可以是任意图像。)

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;
}
}

关于java - JDesktopPane 中类似于桌面快捷方式的图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41223992/

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