Swing改变了JSpinner的颜色和颜色

时间:2014-03-02 12:58:00

标签: java swing jspinner

如何更改JSpinner摆动的背景和前景色?
是否有任何简单的解决方案,除了覆盖paint()方法? 设置背景或前景色不起作用,至少对我而言 我也测试了所有默认的外观和感觉,没有成功 JDK:1.7.0.51 Win764

提前致谢

1 个答案:

答案 0 :(得分:3)

JSpinner是复合成分。简单地说:默认情况下,它会显示一个显示值的JFormattedTextField,以及两个用于增加和减少该值的按钮。

设置这些颜色的一种方法可能是从微调器获取文本字段,并设置其前景色和背景色:

Component c = spinner.getEditor().getComponent(0);
c.setForeground(Color.BLUE);
c.setBackground(Color.RED);

但您可能必须使其更加健壮,以确保它适用于所有LookAndFeel和所有编辑器,无论微调器(和编辑器)如何在内部构建。


编辑以回应评论:在这种情况下是否有效?

import java.awt.Color;
import java.awt.Component;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class SpinnerColors
{
    public static void main(String[] args)
    {
        // Optionally:
        setLookAndFeel();

        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }

    private static void setLookAndFeel()
    {
        try
        {
            UIManager.setLookAndFeel(
                UIManager.getSystemLookAndFeelClassName());
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    private static void createAndShowGUI()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JSpinner spinner = new JSpinner();
        setColors(spinner, Color.BLUE, Color.RED);

        f.getContentPane().add(spinner);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    private static void setColors(
        JSpinner spinner, Color foreground, Color background)
    {
        JComponent editor = spinner.getEditor();
        System.out.println("Editor "+editor);
        int n = editor.getComponentCount();
        for (int i=0; i<n; i++)
        {
            Component c = editor.getComponent(i);
            System.out.println("Component "+i+": "+c);
            if (c instanceof JTextField)
            {
                c.setForeground(foreground);
                c.setBackground(background);
            }
        }
    }
}

请注意,如果您使用“Nimbus”的外观和感觉,事情可能会更困难。 Nimbus因众所周知地忽略了背景色而闻名....


EDIT2 响应第二条评论:基本上可以访问按钮,但对于默认的L&amp; Fs,这些是专用按钮(BasicArrowButton),其中{{ 1}}方法被覆盖以绘制微小的“向上”和“向下”箭头。因此,在这些上设置前景不会有任何影响。相反,你必须修改L&amp; F默认值,这可能总是很麻烦。所以这可能会或可能不会产生你想要达到的效果:

paint