摇摆:调整单选按钮(Swing: Resizing RadioButton)

2019-10-17 07:53发布

我需要实现我的应用程序的字体大小切换。 但是,当我增加字体的大小单选按钮保持相同的尺寸和小屏幕高分辨率我的客户就不能轻易击中它。 有没有一种方法以编程方式调整单选按钮的圆形的东西,而不diging成L&F和手动重绘图标(它是复杂的,因为将应用的目标与不同的UI多个平台和他们每个人都必须有7个图标)。

完美的解决方案看起来是这样的:

  1. 原生UI图标提取。
  2. 调整其大小
  3. 设置调整图标作为组件的图标。

如何实现第1步? 可能吗?

编辑 :这是我试过到目前为止

public class IconImageSaver extends JFrame{

    public IconImageSaver() {

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(0,0,100,100);
        setVisible(true);

        JRadioButton rad1 = new JRadioButton();
        rad1.setBounds(10,10,40,40);
        add(rad1);

        Icon icon = UIManager.getIcon("RadioButton.icon");//(1) trying to get icon

        int w = icon.getIconWidth(),h = icon.getIconHeight();
        Image i = rad1.createImage(w, h);
        Image i2 = rad1.createImage(w,h);
        Graphics g = i.getGraphics();
        Graphics g2 = i2.getGraphics();


        g.setColor(Color.CYAN);
        g.fillRect(0, 0, w, h);
        rad1.setIcon(new ImageIcon(i));//setting icons
        g2.setColor(Color.RED);
        g2.fillRect(0, 0, w, h);
        rad1.setPressedIcon(new ImageIcon(i2));//setting icons
    }

    public static void main(String[] args) {
        new IconImageSaver();
    }

}

在位置(1)我试图让图标图像,但它仅返回背景色。 不明白为什么。 设置了各种状态图标按预期工作。

Answer 1:

一些L&FS(例如雨云水族 )支持 JComponent.sizeVariant ,如所讨论的调整大小的成分使用客户端属性

附录: 我必须使用纯天然的L&F。

一个的呈现JRadioButton通过其相关联的确定ButtonUI委托。 由本机L&F提供委托的内部一般是不可访问,并依靠主机平台的API。 你必须使用用户选择的L&F的可用功能(S)或提供自己的。 如果你能解释一下潜在的问题,它可能有助于建议更好的替代品。

附录:缺席开发完整的L&F,有可能与单选按钮的父,工作JToggleButton 。 这些按钮的做工精良ButtonGroup ,如图所示在这里 ,他们可以任意布置,为概述这里 。



Answer 2:

L&F sensitive ,默认情况下,你可以

  • 使用正确的L&F(仅雨云已经实施auto_whatever),但我们谈论的自定义L&F

  • 覆盖在UIManager的键,但这些键可以,可以(被呈现或值)或缺少与另一L&F比较

  • 创建自己的(J)成分,以在此改变的重要方法和

    一)投入到UIManger(一个高清,有效期为整个JVM instace)

    B)添加到选定的期望或(J)组件的一部分,EI ....在可见GUI

  • 对于通知( I need to implement font size switching in my app ),还有非常重要的测试,如果需要改变(我们将谈到),字体或FontUIResources,对于一部分的实施方法的一部分(J)组件以相当忽视字体和所需FontUIResources,现在不知道是否反之亦然太



Answer 3:

重要提示:这是只使用默认的“金属”外观和感觉的测试。 我不保证这会为任何其他外观和感觉工作。 另外,我不完全相信它是如何工作的,因为这是无可否认的一个黑客位的。

我能这样不同解决一点点。

我在我的缩放字体使用全局的UIManager的默认值,所以我想我的单选按钮的字体缩放。

我发现我可以通过提取图标从UIManager的单选按钮,缓冲它们,大小调整它们,然后从推导的缓冲图标的图形一个新的图标做到这一点。

我结束了此功能:

public static void scaleRadioButtonIcon(JRadioButton rb){
    boolean previousState = rb.isSelected();
    rb.setSelected(false);
    FontMetrics boxFontMetrics =  rb.getFontMetrics(rb.getFont());
    Icon radioIcon = UIManager.getIcon("RadioButton.icon");
    BufferedImage radioImage = new BufferedImage(
        radioIcon.getIconWidth(), radioIcon.getIconHeight(),BufferedImage.TYPE_INT_ARGB
    );
    Graphics graphics = radioImage.createGraphics();
    try{
        radioIcon.paintIcon(rb, graphics, 0, 0);
    }finally{
        graphics.dispose();
    }
    ImageIcon newRadioImage = new ImageIcon(radioImage);
    Image finalRadioImage = newRadioImage.getImage().getScaledInstance(
        boxFontMetrics.getHeight(), boxFontMetrics.getHeight(), Image.SCALE_SMOOTH
    );

    rb.setSelected(true);
    Icon selectedRadioIcon = UIManager.getIcon("RadioButton.icon");
    BufferedImage selectedRadioImage = new BufferedImage(
            selectedRadioIcon.getIconWidth(), selectedRadioIcon.getIconHeight(),BufferedImage.TYPE_INT_ARGB
    );
    Graphics selectedGraphics = selectedRadioImage.createGraphics();
    try{
        selectedRadioIcon.paintIcon(rb, selectedGraphics, 0, 0);
    }finally{
        selectedGraphics.dispose();
    }
    ImageIcon newSelectedRadioImage = new ImageIcon(selectedRadioImage);
    Image selectedFinalRadioImage = newSelectedRadioImage.getImage().getScaledInstance(
        boxFontMetrics.getHeight(), boxFontMetrics.getHeight(), Image.SCALE_SMOOTH
    );
    rb.setSelected(previousState);
    rb.setIcon(new ImageIcon(finalRadioImage));
    rb.setSelectedIcon(new ImageIcon(selectedFinalRadioImage));
}

它的作用是从单选按钮的字体度量获取字体的大小。 利用这些指标,它派生的“外观和感觉”发现和基于图标上的新图标它大小为字体的高度。

我并不能够解释一件事是走出UIManager的的单选按钮图标如何变化的时候,我访问相同的属性来获取这两个图标的“选择”图标。

我通过保存控件的状态,所以我可以在年底将其恢复启动。 这是因为,为了使图标正确设置完成,国家需要的时候,你要求图标第二次被选中,当你第一次请求进行检查来自UIManager,然后将需要的图标,进入“选择“图标。

同样,我不能完全肯定UIManager的工作或者为什么当我们只是通过设置一个单选按钮的“选择”值调用同一个属性的图标会改变,但这是什么,以便同时获得必要的图标必需的。

如果你不想使用的字体大小的控制,你可以很容易地只通过在高度和宽度参数和设置缓冲图像大小时使用它们替代字体的高度。

我可能会提到,这同样的方法可与复选框



文章来源: Swing: Resizing RadioButton