【发布时间】:2020-04-26 16:00:57
【问题描述】:
【问题讨论】:
【问题讨论】:
实现这一点的最佳方法是创建一个实现Icon 接口的自定义类,它只是并排绘制两个给定的图标。
public class TwoIcon implements Icon {
private final int iconGap = 2;
private final Icon icon1;
private final Icon icon2;
public TwoIcon(final Icon icon1, final Icon icon2) {
this.icon1 = icon1;
this.icon2 = icon2;
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
int mid = getIconHeight() / 2;
int y1 = y + mid - icon1.getIconHeight() / 2;
int y2 = y + mid - icon2.getIconHeight() / 2;
icon1.paintIcon(c, g, x, y1);
icon2.paintIcon(c, g, x + icon1.getIconWidth() + iconGap, y2);
}
@Override
public int getIconWidth() {
return icon1.getIconWidth() + icon2.getIconWidth() + iconGap;
}
@Override
public int getIconHeight() {
return Math.max(icon1.getIconHeight(), icon2.getIconHeight());
}
}
图标将并排绘制,填充为2,并垂直居中。
如果您希望它们以不同的方式对齐,请尝试使用间距。
Icon leftIcon = ...
Icon rightIcon = ...
button.setIcon(new TwoIcon(leftIcon, rightIcon));
结果:
我只是在这里使用绘制纯色的图标。一个是16x16,另一个是20x20,大小用于演示垂直对齐方式。
事实上,这不仅限于JButton,也适用于任何可以使用图标的JComponent,例如JLabel等
【讨论】:
这两个图标(快乐/悲伤)真的是所需的图标吗?如果是这样,我建议改为使用JCheckBox 并将图标设置为默认和选定图标(因此复选框在选择时在它们之间更改)。
方法如下(红色图标表示快乐,蓝色图标表示悲伤)。
import java.awt.*;
import java.io.IOException;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.net.*;
import javax.imageio.ImageIO;
public class CheckBoxWithIcons {
private JComponent ui = null;
Image happyImage;
Image sadImage;
CheckBoxWithIcons() {
try {
initUI();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public final void initUI() throws MalformedURLException, IOException {
if (ui!=null) return;
happyImage = ImageIO.read(new URL("https://i.stack.imgur.com/wCF8S.png"));
sadImage = ImageIO.read(new URL("https://i.stack.imgur.com/gJmeJ.png"));
ui = new JPanel(new BorderLayout(4,4));
ui.setBorder(new EmptyBorder(4,100,4,100));
JCheckBox checkBox = new JCheckBox("Mood", true);
checkBox.setIcon(new ImageIcon(sadImage));
checkBox.setSelectedIcon(new ImageIcon(happyImage));
ui.add(checkBox);
}
public JComponent getUI() {
return ui;
}
public static void main(String[] args) {
Runnable r = () -> {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception useDefault) {
}
CheckBoxWithIcons o = new CheckBoxWithIcons();
JFrame f = new JFrame(o.getClass().getSimpleName());
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationByPlatform(true);
f.setContentPane(o.getUI());
f.pack();
f.setMinimumSize(f.getSize());
f.setVisible(true);
};
SwingUtilities.invokeLater(r);
}
}
【讨论】: