2012-02-16 12 views
0

私はカスタムSwingコンポーネントを作成しており、Nimbusのように見えるUIを提供したいと考えています。再利用可能なNimbusペイントコンポーネント(フォーカスリング)

任意のアウトラインShapeに沿って、より良い私はUIDefaults色にアクセスする方法を知っているが、私はより多くのコードを再利用することができ、特に、フォーカスリング(長方形または楕円形を描画オブジェクトを取得するが方法です、または)他のNimbusコンポーネントと全く同じように?

+0

を私はここに同じ答えhttp://stackoverflow.com/a/9311409/714968 – mKorbel

+0

@mKorbelと思います。)ターゲットは、ここでは基本的にはシンセのスタイルが使用している再作成私のソリューションですもしかして?私は 'UIManager'があることを知っていますが、どのようにデフォルトのNimbusフォーカスペインタを取得しますか? –

+1

[Nimbus Defaults](http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/_nimbusDefaults.html)が役立つかどうかを確認してください。 – tenorsax

答えて

0

Nimbusでは新しいコンポーネントにペインタを再利用できるように設計されていませんでした。また、Java 6とNimbusが動く(名前空間 - 何をする

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);} 
} 
関連する問題