ВАЖНОЕ ПРИМЕЧАНИЕ: это было проверено только с «металлическим» внешним видом по умолчанию.Я не гарантирую, что это будет работать для любого другого внешнего вида.Кроме того, я не совсем уверен, как это работает, потому что это, по общему признанию, немного хак.
Я смог решить это немного по-другому.
Я хотел использоватьсуществующие изображения и просто применить масштаб к нему.Я уже масштабирую шрифт моего приложения, используя настройки по умолчанию для UI, поэтому у меня довольно большой шрифт.Я задавался вопросом, смогу ли я использовать это и масштабировать флажки соответственно.
Пройдя по интернету и попробовав кучу вещей, я пришел к этому методу:
public static void scaleCheckBoxIcon(JCheckBox checkbox){
boolean previousState = checkbox.isSelected();
checkbox.setSelected(false);
FontMetrics boxFontMetrics = checkbox.getFontMetrics(checkbox.getFont());
Icon boxIcon = UIManager.getIcon("CheckBox.icon");
BufferedImage boxImage = new BufferedImage(
boxIcon.getIconWidth(), boxIcon.getIconHeight(), BufferedImage.TYPE_INT_ARGB
);
Graphics graphics = boxImage.createGraphics();
try{
boxIcon.paintIcon(checkbox, graphics, 0, 0);
}finally{
graphics.dispose();
}
ImageIcon newBoxImage = new ImageIcon(boxImage);
Image finalBoxImage = newBoxImage.getImage().getScaledInstance(
boxFontMetrics.getHeight(), boxFontMetrics.getHeight(), Image.SCALE_SMOOTH
);
checkbox.setIcon(new ImageIcon(finalBoxImage));
checkbox.setSelected(true);
Icon checkedBoxIcon = UIManager.getIcon("CheckBox.icon");
BufferedImage checkedBoxImage = new BufferedImage(
checkedBoxIcon.getIconWidth(), checkedBoxIcon.getIconHeight(), BufferedImage.TYPE_INT_ARGB
);
Graphics checkedGraphics = checkedBoxImage.createGraphics();
try{
checkedBoxIcon.paintIcon(checkbox, checkedGraphics, 0, 0);
}finally{
checkedGraphics.dispose();
}
ImageIcon newCheckedBoxImage = new ImageIcon(checkedBoxImage);
Image finalCheckedBoxImage = newCheckedBoxImage.getImage().getScaledInstance(
boxFontMetrics.getHeight(), boxFontMetrics.getHeight(), Image.SCALE_SMOOTH
);
checkbox.setSelectedIcon(new ImageIcon(finalCheckedBoxImage));
checkbox.setSelected(false);
checkbox.setSelected(previousState);
}
Что он делает, так это получает размер шрифта из метрики шрифта флажка.Затем, используя его, он получает новый значок, основанный на значке, найденном в «Look and Feel».
Одна странная вещь, которую я не могу объяснить, это то, как значок для флажка в его «невыбранном»'или состояние по умолчанию, меняется на значок' выбранный ', когда я получаю доступ к одному и тому же свойству, чтобы получить каждый из них.
Я начинаю с сохранения состояния элемента управления, чтобы в конце восстановить его.Это сделано потому, что для правильной установки значков необходимо отключить состояние при первом запросе значка из UIManager, а затем его нужно будет проверить при повторном запросе значка, чтобы выбрать «выбранный».'icon.
Я не совсем уверен, как работает UIManager или почему значок флажка меняется, когда мы вызываем одно и то же свойство, просто устанавливая значение "selected" для одного флажка, но это то, что требуется вЧтобы получить оба необходимых значка.
Если вы не хотите основывать размер шрифта, вы можете просто передать в качестве параметров высоту и ширину и использовать их вместо высоты шрифта при установке буферизованногоразмер изображения.
Я мог бы упомянуть, что эта же методика работает с радиокнопками