я хочу увеличить свои JCheckboxes в JTable (для сенсорного экрана), но это не меняет размер.
я попробовал это с
- setPrefferedSize
- setSize
Что я должен делать?..
я хочу увеличить свои JCheckboxes в JTable (для сенсорного экрана), но это не меняет размер.
я попробовал это с
Что я должен делать?..
Я предполагаю, что вы имеете в виду, что хотите увеличить флажок. Если это так, вам нужно создать изображения для представления невыбранных и выбранных значков флажка. Затем вы можете создать средство визуализации и редактор, используя эти значки. Наконец, вам нужно будет увеличить высоту каждой строки в таблице. Код может выглядеть примерно так:
Icon normal = new ImageIcon(...);
Icon selected = new ImageIcon(...);
JTable table = new JTable(...);
table.setRowHeight(...);
TableCellRenderer renderer = table.getDefaultRenderer(Boolean.class);
JCheckBox checkBoxRenderer = (JCheckBox)renderer;
checkBoxRenderer.setIcon( normal );
checkBoxRenderer.setSelectedIcon( selected );
DefaultCellEditor editor = (DefaultCellEditor)table.getDefaultEditor(Boolean.class);
JCheckBox checkBoxEditor = (JCheckBox)editor.getComponent();
checkBoxEditor.setIcon( normal );
checkBoxEditor.setSelectedIcon( selected );
ВАЖНОЕ ПРИМЕЧАНИЕ. Это было протестировано только с внешним видом «Металл» по умолчанию. Я не гарантирую, что это будет работать для любого другого внешнего вида. Кроме того, я не совсем уверен, как это работает, потому что это, по общему признанию, что-то вроде взлома.
Я смог решить это немного другим способом.
Я хотел использовать существующие изображения и просто применить к ним масштаб. Я уже масштабирую шрифт своего приложения, используя настройки пользовательского интерфейса по умолчанию, поэтому у меня довольно большой шрифт. Я задавался вопросом, могу ли я использовать это и соответствующим образом масштабировать флажки.
Порыскав в интернете и перепробовав кучу вещей, я придумал этот метод:
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);
}
Что он делает, так это получает размер шрифта из метрик шрифта флажка. Затем, используя это, он получает новый значок на основе значка, найденного в «Внешний вид».
Одна странная вещь, которую я не могу объяснить, заключается в том, как значок флажка в его «не выбранном» состоянии или состоянии по умолчанию меняется на «выбранный» значок, когда я обращаюсь к одному и тому же свойству, чтобы получить каждый из них.
Я начинаю с сохранения состояния элемента управления, чтобы в конце восстановить его. Это сделано потому, что для того, чтобы значки были установлены правильно, состояние должно быть снято при первом запросе значка из UIManager, а затем его нужно будет проверить, когда вы запрашиваете значок во второй раз, чтобы получить «выбрано». ' значок.
Я не совсем уверен, как работает UIManager или почему значок флажка меняется, когда мы вызываем одно и то же свойство, просто устанавливая значение «выбрано» для одного флажка, но это то, что требуется для получения обоих необходимых значков.
Если вы не хотите основывать размер на шрифте, вы можете просто передать высоту и ширину в качестве параметров и использовать их вместо высоты шрифта при установке размера буферизованного изображения.
Я мог бы упомянуть, что эта же методология работает с переключателями