UI
カスタムSwingコンポーネントを作成していて、Nimbusのように見えるものを提供したいと思います。
色にアクセスする方法は知っていますが、より多くのコードを再利用できますか?特に、他のNimbusコンポーネントとまったく同じように、フォーカスリング(長方形または楕円形、さらには輪郭に沿って)UIDefaults
をペイントするオブジェクトを取得する方法はありますか? ?(車輪の再発明なしで)Shape
Nimbusで、新しいコンポーネントにペインターを再利用できるようにするための設計上の決定が見られなかったため、また、Java 6とNimbusが移動(名前空間)ターゲットであるOS Xに固執しているため、基本的に再作成するソリューションを次に示します。 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 );}
}