Многоразовые компоненты для окраски Nimbus (кольцо фокусировки) - PullRequest
0 голосов
/ 17 февраля 2012

Я создаю пользовательские компоненты Swing и хочу предоставить UI, который выглядит точно так же, как Nimbus.

Я знаю, как получить доступ к UIDefaults цветам, но могу ли я повторно использовать больше кода, в частности, есть ли способ получить объект, который рисует кольца фокусировки (прямоугольные или овальные, или даже лучше вдоль любого контура Shape) точно так же, как и другие компоненты Nimbus? (без изобретения колеса)

1 Ответ

0 голосов
/ 18 февраля 2012

Поскольку в Nimbus я не видел никакого дизайнерского решения, позволяющего повторно использовать средства рисования для новых компонентов, а также я застрял на OS X с Java 6 и Nimbus, являющимся движущейся (пространство имен), вот мое решениекоторый в основном воссоздает то, что использует стиль Synth:

import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;

public class NimbusFocusBorder implements javax.swing.border.Border {
    private static final RoundRectangle2D rect = new RoundRectangle2D.Float();
    private static final Area area = new Area();

    private final float arcIn;
    private final float arcOut;

    public NimbusFocusBorder() {
        arcIn = arcOut = 0f;
    }

    public NimbusFocusBorder( float rounded ) {
        arcIn  = rounded * 2;
        arcOut = arcIn + 2.8f;
    }

    public void paintBorder( Component c, Graphics _g, int x, int y, int w, int h ) {
        if( !c.hasFocus() ) return;
        final Graphics2D g = (Graphics2D) _g;
        g.setRenderingHint( RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON );
        g.setColor( /* NimbusHelper. */ getFocusColor() );
        rect.setRoundRect( x + 0.6, y + 0.6, w - 1.2, h - 1.2, arcOut, arcOut );
        area.reset();
        area.add( new Area( rect ));
        rect.setRoundRect( x + 2, y + 2, w - 4, h - 4, arcIn, arcIn );
        area.subtract( new Area( rect ));
        g.fill( area );

    }

    public Insets getBorderInsets( Component c ) {
        return new Insets( 2, 2, 2, 2 );
    }

    public boolean isBorderOpaque() { return false; }

    // this actually looks up the color in UIDefaults
    // in the real implementation
    private Color getFocusColor() { return new Color( 115, 164, 209, 255 );}
}
...