让JCheckbox更大..?

时间:2011-01-22 19:23:36

标签: java swing size jtable jcheckbox

我想让JTable中的JCheckbox更大(对于触摸屏),但它不会改变大小。

我用

尝试了
  • setPrefferedSize
  • 的setSize

我该怎么办?

2 个答案:

答案 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