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