Java 如何将自定义JTextField影响作为默认值应用,并对每个状态具有不同的影响?

Java 如何将自定义JTextField影响作为默认值应用,并对每个状态具有不同的影响?,java,swing,jtextfield,Java,Swing,Jtextfield,我正在为我的程序使用Nimbus LAF,并创建了一个具有圆形边框、着色等的自定义JTextField,我对此非常满意,但是我希望能够将影响设置为默认值,这样我就不必将其应用于每个JTextField。我不介意将其应用到每个领域。我主要关心的是,我希望能够对每个状态产生不同的影响(即:聚焦、非聚焦、禁用、启用等)。下面是我目前用于实现单个自定义更改的代码。是否仍然可以将其作为默认值应用,更重要的是,我是否可以将其作为默认值应用于JTextField的不同状态 public class Round

我正在为我的程序使用Nimbus LAF,并创建了一个具有圆形边框、着色等的自定义JTextField,我对此非常满意,但是我希望能够将影响设置为默认值,这样我就不必将其应用于每个JTextField。我不介意将其应用到每个领域。我主要关心的是,我希望能够对每个状态产生不同的影响(即:聚焦、非聚焦、禁用、启用等)。下面是我目前用于实现单个自定义更改的代码。是否仍然可以将其作为默认值应用,更重要的是,我是否可以将其作为默认值应用于JTextField的不同状态

public class RoundJTextField extends BasicTextFieldUI {
private int round = 5;
private int shadeWidth = 2;
private int textSpacing = 3;

public void installUI ( JComponent c )
{
    super.installUI ( c );

    c.setOpaque ( false );

    int s = shadeWidth + 1 + textSpacing;
    c.setBorder ( BorderFactory.createEmptyBorder ( s, s, s, s ) );
}

protected void paintSafely ( Graphics g )
{
    Graphics2D g2d = ( Graphics2D ) g;
    g2d.setRenderingHint ( RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON );

    Shape border = getBorderShape ();

    Stroke os = g2d.getStroke ();
    g2d.setStroke ( new BasicStroke ( shadeWidth * 2 ) );
    g2d.setPaint ( new Color(220,220,220) );
    g2d.draw ( border );
    g2d.setStroke ( os );

    g2d.setPaint ( new Color(176,176,176) );
    g2d.fill ( border );

    g2d.setPaint ( new Color(0,0,0) );
    g2d.draw ( border );

    super.paintSafely ( g );
}

private Shape getBorderShape ()
{
    JTextComponent component = getComponent ();
    if ( round > 0 )
    {
        return new RoundRectangle2D.Double ( shadeWidth, shadeWidth,
                component.getWidth () - shadeWidth * 2 - 1,
                component.getHeight () - shadeWidth * 2 - 1, round * 2, round * 2 );
    }
    else
    {
        return new Rectangle2D.Double ( shadeWidth, shadeWidth,
                component.getWidth () - shadeWidth * 2 - 1,
                component.getHeight () - shadeWidth * 2 - 1 );
    }
}
}

当前要设置我使用的JTextField,请执行以下操作:

snTF = new JTextField(tfW); 
snTF.setUI(new RoundJTextField());

非常感谢您的帮助。

您可以创建一个扩展
JTextField
的类,并在构造函数中调用当前调用的方法来设置当前
JTextField
的UI,然后不创建
JTextField
s,只需创建默认具有自定义效果的
MyJTextField
s即可。

如果使用Nimbus,则可以实现
Painter
界面()。然后,可以将自定义绘制者指定给
UIDefaults
类中的属性(从
UIManager.getDefaults()
获取)。例如,要在JTextField上移动鼠标时更改其边框,请将
TextField[MouseOver].borderPainter
属性设置为您自己的
Painter
。当鼠标位于文本字段上方时,Nimbus外观将委托您的
画师绘制边框

资料来源:(从第27页起)