我想让 JTable 中的 JCheckboxes 更大(用于触摸屏),但它不会改变大小。
我试过了
- 设置首选大小
- 设置大小
我应该怎么办?..
重要提示:这仅在默认的“金属”外观和感觉下进行了测试。我不保证这适用于任何其他外观和感觉。此外,我也不完全确定它是如何工作的,因为它确实有点像 hack。
我能够以稍微不同的方式解决这个问题。
我想使用现有的图像并对其应用比例。我已经使用 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);
}
它所做的是从复选框的字体度量中获取字体的大小。然后使用它根据“外观”中找到的图标派生一个新图标。
我无法解释的一件奇怪的事情是,当我访问相同的属性以获取每个属性时,处于“未选中”或默认状态的复选框图标如何更改为“选中”图标。
我首先保存控件的状态,以便在最后恢复它。这样做是因为为了正确设置图标,当您第一次从 UIManager 请求图标时需要取消选中状态,然后在第二次请求图标时需要检查状态以获得“已选中” ' 图标。
我不完全确定 UIManager 是如何工作的,或者为什么当我们仅通过设置单个复选框的“选定”值来调用相同的属性时复选框图标会发生变化,但这是获得两个必要图标所必需的。
如果您不想基于字体大小,您可以轻松地将高度和宽度作为参数传递,并在设置缓冲图像大小时使用它们而不是字体的高度。
我假设你的意思是你想要一个更大的复选框。如果是这样,那么您需要创建图像来表示复选框的未选中和选中的图标。然后,您可以使用这些图标创建渲染器和编辑器。最后,您需要增加表格中每一行的高度。代码可能类似于:
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 );