5

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

我试过了

  • 设置首选大小
  • 设置大小

我应该怎么办?..

4

2 回答 2

4

重要提示:这仅在默认的“金属”外观和感觉下进行了测试。我不保证这适用于任何其他外观和感觉。此外,我也不完全确定它是如何工作的,因为它确实有点像 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 是如何工作的,或者为什么当我们仅通过设置单个复选框的“选定”值来调用相同的属性时复选框图标会发生变化,但这是获得两个必要图标所必需的。

如果您不想基于字体大小,您可以轻松地将高度和宽度作为参数传递,并在设置缓冲图像大小时使用它们而不是字体的高度。

我可能会提到同样的方法适用于单选按钮

于 2014-11-18T13:03:24.700 回答
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 );
于 2011-01-22T20:03:59.250 回答