Java JButton 两个或多个图标
Java JButton two or more icons
我想为一个 JButton(Java、Swing)设置两个或更多图标。可能吗?
我添加了绘图中的图片。 ;-)
实现此目的的最佳方法是创建一个实现 Icon
界面的自定义 class,它只是并排绘制两个给定的图标。
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);
}
}
我想为一个 JButton(Java、Swing)设置两个或更多图标。可能吗?
我添加了绘图中的图片。 ;-)
实现此目的的最佳方法是创建一个实现 Icon
界面的自定义 class,它只是并排绘制两个给定的图标。
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);
}
}