2012-05-05 8 views
2

スイングとカスタムペイントコンポーネントの材料で少し眠りに乗ることにしました。 ここ数日、StackOverFlowや他のフォーラムで、数多くの記事、APIドキュメント、質問をここで読んでいます。しかし、まだ私は概念を理解する上でいくつかの基本的な問題があります。カスタムJScrollBar-Thumbがペイントされていますが、移動しません。

私がしたいこと:基本的に、私は自分のSwing GUI用にいくつかのコンポーネントを設計したいと思います。私は、カスタムJButtonを設計するのに多くの問題はありません。私はpaint.netにカスタムImageを作成し、ImageIconを作成してJButton.setIcon(ImageIcon)を作成します。これは正常に動作します。 JSliderのThumbをカスタマイズしたい場合も同じ話です。私はここで非常に面白い解決策を見つけました。それは何もせずにdefault-thumbを単にオーバーライドし、2番目のステップでは、UIMangerへの "Slider.horizo​​ntalThumbIcon"のカスタムImageIcon(ClassLoaderを使用して私のカスタムcreateImageIconクラスを使用)を配置します。

UIManager.getLookAndFeelDefaults().put("Slider.horizontalThumbIcon", new Icon(){ 

    public int getIconHeight() { 
     return 0; 
    } 

    public int getIconWidth() { 
     return 0; 
    } 

    public void paintIcon(Component c, Graphics g, int x, int y) { 
     //do nothing 
    } 
}); 

UIManager.getLookAndFeelDefaults().put("Slider.horizontalThumbIcon", 
             createImageIcon("images/slider.png")); 

しかし、今問題が開始されます。私が間違っていない場合、ScrollBarの親指はアイコンではないので、BasicScrollBarUIを拡張する独自の "CustomScrollBarUI"クラスを作成する必要があります。さらに私はどんな矢印キーも望んでいません。 OK、私は(ここからいくつかのサンプルコードから再び私を鼓舞)以下でした:

public class CustomScrollBarUI extends BasicScrollBarUI { 

    private ImageIcon img; 

    protected JButton createZeroButton() { 
     JButton button = new JButton("zero button"); 
     Dimension zeroDim = new Dimension(0,0); 
     button.setPreferredSize(zeroDim); 
     button.setMinimumSize(zeroDim); 
     button.setMaximumSize(zeroDim); 
     return button; 
    } 


    protected JButton createDecreaseButton(int orientation) { 
     return createZeroButton(); 
    } 


    protected JButton createIncreaseButton(int orientation) { 
     return createZeroButton(); 
    } 


    protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) { 
     BufferedImage img = new LoadBackgroundImage("images/slider.png").getImage(); 
     g.drawImage(img, 0, 0, new Color(255,255,255,0), null); 
    } 


    protected void setThumbBounds(int x, int y,int width,int height){ 
      super.setThumbBounds(x, y, 14, 14); 
    } 


    protected Rectangle getThumbBounds(){ 
      return new  Rectangle(super.getThumbBounds().x,super.getThumbBounds().y,14,14); 
    } 


     protected Dimension getMinimumThumbSize(){ 
     return new Dimension(14,14); 
    } 


    protected Dimension getMaximumThumbSize(){ 
     return new Dimension(14,14); 
    } 
} 

LoadBackGroundImageは、クラスローダを経由してBufferedImageを作成し、独自のクラスです。スクロールバーの親指は私のカスタム "slider.png"ですが、動きません。私がそれを下にドラッグすると、ペインがスクロールしますが、親指は彼のところにとどまります。 私はまだすべての仕組みを理解していないので、私はpaintImageメソッドについて読んでいます。 ImageObserverをコミットする必要があります。ImageObserverの機能はわかりません。私は(私のように)ヌルをコミットするネット上のさまざまなコード例を見つけましたが、私はこれは移動しなければならない画像のためにはうまくいかないと思います。これをどうすれば解決できますか?私がpaintThumbメソッドで通常のグラフィックをペイントすると、正常に動作しますが、イメージをペイントするとすぐに動きません。

誰かが私を助けてくれることを願っています。前もって感謝します。あなたの特定のケースで

答えて

2

- あなたはいつも同じ場所@画像をペイントしている。ここでは「0、0」である

protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) { 
    BufferedImage img = new LoadBackgroundImage("images/slider.png").getImage(); 
    g.drawImage(img, 0, 0, new Color(255,255,255,0), null); 
} 

は「X、Yは」ゼロに配置されたスクロールバーの座標システム(座標左上隅)。

現在のサム位置を指すpaintThumbメソッド(Rectangle thumbBounds)で親指の境界を取得します。これらの値を使用して、適切な場所に画像をペイントします。

あなたの親指の画像サイズが受信したthumbBoundsに合わない場合は、中点と中央の画像を計算することができます。それだけのことはありますが、あなたは好きなやり方でこれを行うことができます。

そして、私は、さまざまなUIのほぼすべての別々のペイントメソッドが同じ座標系に配置されているということを付け加えたいと思いますので、常に塗りつぶしまたは計算する場所を置くためには座標/それはあなた自身で。

+0

素晴らしい、ありがとう。もちろんそれは理にかなっています! :)あなたが気にしないなら、私は何か他に尋ねることができますか?私の具体的なケースでは、ScrollPaneをJListのTest-Valuesに置きます。今、私がScrollBarを動かすと、List内のStringは正しく描画されません。画像tp://tinypic.com/r/1195eoj/6を参照してください。なぜこのようなことが起こったのか考えていますか?私はいくつかのrepaint() - 呼び出しは適切ではないと呼ばれる –

+0

と申します。リンクはhttp://tinypic.com/r/1195eoj/6です。 –

+0

レンダラーの内部に投げ込まれたいくつかの例外や、リスト。私はStackOverflow上の別の質問スレッドにその質問を移動し、その問題をいくつかのコードを表示するようにしたいと思います。 –

関連する問題