2

スイングとカスタムペイントコンポーネントのマテリアに少し深く潜ることにしました。ここ数日、StackOverFlowやその他のフォーラムで、たくさんの記事、APIドキュメント、質問を読みました。しかし、それでも私は概念を理解する上でいくつかの基本的な問題を抱えていました。

やりたいこと:基本的に、自分のSwingGUI用にいくつかのコンポーネントを設計したいと思います。カスタムJButtonの設計にはそれほど問題はありません。paint.netでカスタム画像を作成し、ImageIconを作成して、JButton.setIcon(ImageIcon)を作成します。これは正常に機能します。JSliderのThumbをカスタマイズしたい場合も同じです。私はここで非常に面白い解決策を見つけました。デフォルトのthumbを何も上書きせず、2番目のステップで、「Slider.horizo​​ntalThumbIcon」のカスタムImageIcon(ClassLoaderを介したカスタムcreateImageIconクラスを使用)をUIMangerに配置します。

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は独自のクラスであり、ClassLoaderを介してBufferedImageを作成します。スクロールバーのつまみが私のカスタム「slider.png」になりましたが、動きません。下にドラッグすると、ペインはスクロールしますが、親指は彼の場所に残ります。まだすべてのメカニズムを理解していないので、paintImageメソッドについて読みました。そこで、ImageObserverをコミットする必要がありますが、その関数は私にはよくわかりません。ネット上でnullをコミットするさまざまなコード例を見つけました(私のように)が、これは移動する必要がある(したがって再描画する必要がある)画像では機能しないと思います。どうすればこれを解決できますか?paintThumbメソッドで通常のグラフィックをペイントすると、正常に機能しますが、イメージをペイントするとすぐに移動しません。

誰かが私を助けてくれることを願っています。前もって感謝します。

4

1 に答える 1

2

あなたの特定のケースでは-あなたはいつも同じ場所で画像をペイントしています:

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);
}

ここでの「0、0」は、スクロールバー座標系の「x、y」座標です(このゼロは左上隅に配置されます)。

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

親指の画像サイズが受け取ったthumbBoundsに合わない場合は、その中間点と中央の画像を計算できます。それはほんの一例ですが、他の方法でそれを行うことができます。

また、さまざまなUIのほぼすべての分離されたペイント方法が同じ座標系に配置されるため、ペイントするものを配置するか、自分で計算するには、常に受信した座標/境界/...を使用する必要があります。 。

于 2012-05-05T15:43:03.920 に答える