Java 让JCheckbox更大。。?

Java 让JCheckbox更大。。?,java,swing,size,jtable,jcheckbox,Java,Swing,Size,Jtable,Jcheckbox,我想把我的jcheckbox做成一个更大的JTable(用于触摸屏),但它不会改变大小 我试过了 setPreferedSize 设置大小 我该怎么办?。我想你的意思是你想要一个更大的复选框。如果是这样,则需要创建图像来表示复选框的未选定和选定图标。然后可以使用这些图标创建渲染器和编辑器。最后,需要增加表中每一行的高度。代码可能类似于: Icon normal = new ImageIcon(...); Icon selected = new ImageIcon(...); JTable t

我想把我的jcheckbox做成一个更大的JTable(用于触摸屏),但它不会改变大小

我试过了

  • setPreferedSize
  • 设置大小

我该怎么办?。

我想你的意思是你想要一个更大的复选框。如果是这样,则需要创建图像来表示复选框的未选定和选定图标。然后可以使用这些图标创建渲染器和编辑器。最后,需要增加表中每一行的高度。代码可能类似于:

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 );

重要提示:仅使用默认的“金属”外观进行测试。我不保证这将工作的任何其他外观和感觉。此外,我也不完全确定它是如何工作的,因为它确实有点像黑客。

我能够用一种稍微不同的方式解决这个问题

我想使用现有的图像,并对其应用比例。我已经在使用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是如何工作的,也不完全清楚当我们仅仅通过设置单个复选框的“selected”值来调用同一属性时,为什么复选框图标会改变,但这是获得两个必要图标所必需的

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


我为Boolean.class列提供了自己的渲染器。。但是,当我设置图标时,它不会显示,当我单击它时,它会在短时间内显示“正常”复选框。是的,当您单击它时,会显示“编辑器”,这就是为什么您需要自定义渲染器和编辑器的原因。如果未显示图标,则自定义代码不起作用。首先尝试使用默认的渲染器和编辑器来理解这个概念。然后,如果您仍然觉得需要自定义渲染器和编辑器,您可以同时更改它们。为什么?代码不会改变渲染器,只会改变渲染器使用的图标。这是很多代码,我觉得可以通过语言中的“缩放”功能或OSThank you camickr实现。你发布的解决方案非常酷。我尝试了很多其他的方法,但都失败了,你的方法是唯一有效的方法。非常好,谢谢!我正在使用Windows的外观,到目前为止,它对我很有效。唯一的缺点是,您无法获得正常Windows7复选框所获得的“鼠标悬停”效果。通常,当您指向复选框时,它会发出蓝色的光。但是当使用这种缩放方法时,就会失去这种效果。