2

JSlider ウィジェットに似た新しいウィジェットを作成することに興味がありますが、以前のスライダーの位置を表示する「ゴースト」(半透明) ノブと、実際のノブの動きにトレイルのようなアニメーションを追加することに興味があります。

Java Swing ウィジェットを拡張して新しい機能を追加する適切な方法について、少し混乱しています。

私が見ているように、いくつかのオプションがあります。

1) JSlider を拡張し、すべての新しいモデル情報をここに配置し、ペイントを上書きして最初に JSlider を描画し、必要な追加をオーバーレイします。このソリューションの問題は、試行錯誤を使用してマークを正しい位置に配置する必要があり (完全な幾何学的情報にアクセスできないため)、すべての状況で機能しない可能性があることです。

2) Slider ウィジェットのさまざまなクラス (JSlider、SliderUI、BasicSliderUI、MetalSliderUI、BoundedRangeModel、DefaultBoundedRangeModel) を拡張します。ここで見られる利点は、適切なモデル ビュー コントローラー アーキテクチャを維持できることです。ただし、これには、クラス内のさまざまな関数をオーバーロードする必要があります。結果は非常にハッキングされたように見えると思います。

3) Slider ウィジェットのコードをすべてコピーし、変更して新しいウィジェットを作成します。これはオプション (2) に似ていますが、関数を拡張するよりもコードを変更する方が少し簡単かもしれません (とにかく基本的にコードをコピー/変更します)。

4) 目的の機能を使用して、スライダー ウィジェットをゼロから再作成します。既存の Swing Slider ウィジェットのコードを見てみると、これは簡単な作業ではありません。

既存のウィジェットから機能を借用した新しいウィジェットを作成する、より洗練された方法がありませんか?

あなたの洞察に感謝します。

4

1 に答える 1

2

2) いくつかの変更を加えWrapperSliderUIて、すべてのメソッド呼び出しをデリゲート UI にデリゲートするクラスを作成します。そして、ペイントメソッドだけをオーバーライドします。

JSlider の SetUI は、元の UI を WrapperSliderUI でラップする必要があります。

public void setUI(SliderUI ui) {
    super.setUI(new WrapperSliderUI(ui));
}

ペイントでは、元の UI クラスを確認し、それに応じてペイントを調整します。

于 2011-11-02T07:19:48.090 に答える