0

在课堂上,我将如何更改两个(上下)组件JSpinner的前景色?不起作用 。 提前致谢。编辑BasicArrowButton
component.setForeground(<<a_color>>)


private void set_colors(JSpinner spinner){
    int n = spinner.getComponentCount();
    for (int i=0; i<n; i++)
    {
        Component c = spinner.getComponent(i);
        System.out.println(c);
        if (c instanceof BasicArrowButton)
        {
            c.setForeground(ds_conn_text.getForeground());//doesn't work, doesn't change arrow color
            c.setBackground(ds_conn_text.getBackground());
            BasicArrowButton c0=(BasicArrowButton) c;c0.setBorder(ok_button.getBorder());
        }
    }
}
4

1 回答 1

2

这是Swing 更改 JSpinner 前后颜色的后续问题

不可能设置箭头的颜色而不覆盖该paint方法。原因很简单,箭头的颜色与用于按钮“阴影”的颜色相同。所以你可以把这条线

UIManager.getDefaults().put("controlDkShadow", Color.MAGENTA);

在你的某个地方main,但这不仅会改变箭头颜色,还会改变其他元素的颜色,实际上应该改变。

仅为特定实例设置此颜色的丑陋/骇人听闻的方法是

private static void hackilySetColor(JSpinner spinner, Color color)
{
    int n = spinner.getComponentCount();
    for (int i=0; i<n; i++)
    {
        Component c = spinner.getComponent(i);
        if (c instanceof BasicArrowButton)
        {
            try
            {
                Field field = BasicArrowButton.class.getDeclaredField("darkShadow");
                field.setAccessible(true);
                field.set(c, color);
                field.setAccessible(false);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
}

但这使用了反射,确实是一个丑陋的hack,并且仍然替换了按钮“暗影”边框的颜色。

对于这样的事情,您最好使用自己的用户界面(或者......根本不改变颜色 - 无论如何这对我来说似乎毫无用处......)

于 2014-03-02T20:11:57.633 回答