我们正在使用 JDesktopPane 和 JInternalFrames 作为我们的软件,我想知道我们是否可以在桌面窗格中放置快捷方式图标(特定框架)(类似于Windows桌面快捷方式)。我搜索了这个,但没有运气。
任何想法的人都能做到这一点?
答案 0 :(得分:1)
以下是不 a" good"解决方案,但对于某些应用案例可能还行。主要的困难是在这里发挥作用的中心类是JInternalFrame.JDesktopIcon
,并且该类的文档包含
Swing应用程序不应该使用此API,因为它将在Swing的未来版本中消失,因为它的功能被移动到JInternalFrame中。
但是,JInternalFrame
中的相应功能根本就不存在。虽然我必须接受在将来的版本中删除JDesktopIcon
类 ,但考虑到在内部Swing UI实现中广泛使用此类,我似乎不太可能。 / p>
但是:实现此目的的一个选项是创建BasicDesktopIconUI
的自定义扩展。幸运的是,这个类可以处理大多数清洁工作,例如拖动支持并在双击时取消对图标的显示。
因此,人们可以轻松地将自定义图标隐藏到这样的实现中(我在这里只使用了占位符:黑色背景上的红叉。但它可以是任意Image
。)
这是在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;
}
}