gpt4 book ai didi

java - Swing 改变 JSpinner 的前后颜色

转载 作者:行者123 更新时间:2023-11-30 08:25:31 25 4
gpt4 key购买 nike

如何在 swing 中更改 JSpinner 的背景色和前景色?
除了覆盖 paint() 方法之外,是否有任何简单的解决方案?
设置背景或前景颜色不起作用,至少对我而言。
我还使用所有默认外观进行了测试,但没有成功。
JDK: 1.7.0.51 Win764

提前致谢

最佳答案

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&F,这些是专门的按钮 (BasicArrowButton),其中 paint 方法被覆盖以绘制微小的“向上”和“向下”箭头。所以在这些上面设置前景是不会有任何效果的。相反,您必须修改 L&F 默认值,这可能总是很麻烦。所以这可能会也可能不会达到您想要达到的效果:

private static void setButtonColors(
JSpinner spinner, Color foreground, Color background)
{
int n = spinner.getComponentCount();
for (int i=0; i<n; i++)
{
Component c = spinner.getComponent(i);
if (c instanceof JButton)
{
c.setForeground(foreground); // Has no effect
c.setBackground(background);
}
}
}

关于java - Swing 改变 JSpinner 的前后颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22127833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com