Вот что я пробовал:
- На изображении ниже, чтобы создать «32, масштабированное до 16», я вызвал imageIcon.getImage().getScaledInstance(16, 16, Image.SCALE_SMOOTH) Этот метод был написан задолго до изобретения экранов с высоким разрешением и возвращает изображение с низким разрешением. в половинном размере.
- Чтобы создать «16-пиксельный вариант», я создал MultiResolutionImage с 16-пиксельными и 32-пиксельными вариантами и вызвал multiResImage.getResolutionVariant(16, 16), который запрашивает 16-пиксельный вариант, надеясь, что он уменьшит 32-пиксельный вариант. Он использовал 32-пиксельный вариант, но в полном размере. Это заставляет меня задуматься, для чего нужен этот класс.
- Чтобы создать «Кнопку половинного размера», я создал подкласс ImageIcon половинного размера и переопределил три метода, используемые для рисования изображения. Частично это сработало. Это было единственное решение, которое рисовало изображение в правильном размере и разрешении, но помещало изображение не в то место. (Код этого класса приведен ниже.)

Вот класс ImageIcon половинного размера:
public static class HalfSizeIcon extends ImageIcon {
private static final float scale = 0.5f;
public HalfSizeIcon(ImageIcon icon) {
super(icon.getImage());
if (icon.getDescription() != null) {
setDescription(icon.getDescription());
}
}
@Override
public synchronized void paintIcon(
final Component c,
final Graphics g,
final int x,
final int y) {
Graphics2D g2 = (Graphics2D) g;
AffineTransform savedTransform = g2.getTransform();
g2.scale(scale, scale);
super.paintIcon(c, g2, x, y);
g2.setTransform(savedTransform);
}
@Override
public int getIconWidth() {
return Math.round(scale * (super.getIconWidth()));
}
@Override
public int getIconHeight() {
return Math.round(scale * (super.getIconHeight()));
}
}