【问题标题】:Make JCheckbox bigger..?让 JCheckbox 更大..?
【发布时间】:2011-01-22 19:23:35
【问题描述】:

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

我试过了

  • setPreferedSize
  • 设置大小

我该怎么办?..

【问题讨论】:

    标签: java swing size jtable jcheckbox


    【解决方案1】:

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

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

    【讨论】:

    • 我有我自己的 Boolean.class 列的渲染器.. 但是当我设置图标时它不会显示,当我点击它时,它会显示一秒钟的正常复选框..
    • 是的,当您单击它时,会显示“编辑器”,这就是您需要自定义渲染器和编辑器的原因。如果未显示图标,则您的自定义代码不起作用。首先尝试使用默认的渲染器和编辑器来理解这个概念。然后,如果您仍然觉得需要自定义渲染器和编辑器,您可以同时更改两者。
    • 为什么?代码不会改变渲染器,只会改变渲染器使用的图标。
    • 我觉得通过语言或操作系统的“缩放”功能应该可以实现很多代码
    • 谢谢camickr,您发布的解决方案非常酷。我尝试了一大堆其他的东西,但都失败了,你的是唯一有效的解决方案。
    【解决方案2】:

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

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

    I might mention that this same methodology works with radiobuttons

    【讨论】:

    • 干得好,谢谢!我正在使用 Windows 的外观和感觉,到目前为止它对我有用。唯一的缺点是您没有获得普通 Windows 7 复选框所获得的“鼠标悬停”效果。通常,当您指向复选框时,它会发出蓝色光。但是当使用这种缩放方法时,你会失去这种效果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多