我想让JTable中的JCheckbox更大(对于触摸屏),但它不会改变大小。
我用
尝试了我该怎么办?
答案 0 :(得分:4)
我认为你的意思是你想要一个更大的复选框。如果是,则需要创建图像以表示复选框的未选定和选定图标。然后,您可以使用这些图标创建渲染器和编辑器。最后,您需要增加表中每行的高度。代码可能类似于:
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 );
答案 1 :(得分:3)
重要提示:仅使用默认的“金属”外观进行测试。我不保证这适用于任何其他外观和感觉。此外,我不完全确定它是如何工作的,因为它确实是一个黑客攻击。
我能够以稍微不同的方式解决这个问题。
我想使用现有的图片,只需对其应用比例。我已经使用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请求图标时需要取消选中状态,然后当您第二次请求图标时需要检查状态'icon。
我不完全确定UIManager是如何工作的,或者当我们通过设置单个复选框的“selected”值来调用同一属性时,复选框图标会发生变化的原因,但这是为了获得必要的两者所需要的的图标。
如果您不希望基于字体大小,您可以轻松地将高度和宽度作为参数传递,并在设置缓冲图像大小时使用它们而不是字体的高度。
I might mention that this same methodology works with radiobuttons