4

アプリケーションのさまざまな場所でJColorchooserを使用しています。JColorChooser を呼び出すことができるパネルの複数のインスタンスが存在する場合があります。
セレクターの「スウォッチ」パネルには、「最近の」色の領域があり、JColorChooser の各インスタンス内でのみ保持されます。(a)アプリケーションのすべてのセレクターで同じ「最近の」色を使用し、 (b) 色をディスクに保存して、これらの色が近くに残ってアプリケーションを再起動できるようにしたいと考えています。
(少なくとも (a) は、アプリ全体で同じ単一のセレクター インスタンスを使用することで解決できますが、アタッチされた変更リスナーには非常に注意する必要があるため、面倒なようです。

選択パネルでこれらの「最近の」色を設定 (復元) できる方法が見つかりませんでした。したがって、私には、これを達成する唯一の方法は次のように思われます。

  • セレクター全体(セレクターパネル?)をシリアル化して保存/復元するか、
  • 独自のセレクター パネルをゼロから作成する

これは正しいですか、何か不足していますか?

ところで:セレクターでダブルクリックを検出したいのですが、マウスリスナーを接続する適切な場所を見つけるのは難しいようです。これを行うには、セレクターパネルの内部構造を掘り下げる必要がありますか? (いいえ、別の色がクリックされた場合にのみ変更リスナーが起動するため、同じ色の 2 回目のクリックを検出することはできません。)

4

3 に答える 3

4

お気付きのように、DefaultSwatchChooserPanel の最近の色にアクセスするための公開 API はなく、パネル自体にもアクセスできません。

とにかく最近の色を保持してリセットするロジック/ビーンが必要になるので(さらにマウス操作の拡張)、独自のロールを作成する方法があります。いくつかのガイダンスについては、スウォッチ パネルの実装を参照してください (せき.​​.. 必要なものを c&p し、必要でないものを変更します)。基本的に、次のようなもの

// a bean that keeps track of the colors
public static class ColorTracker extends AbstractBean {

    private List<Color> colors = new ArrayList<>();

    public void addColor(Color color) {
        List<Color> old = getColors();
        colors.add(0, color);
        firePropertyChange("colors", old, getColors());
    }

    public void setColors(List<Color> colors) {
        List<Color> old = getColors();
        this.colors = new ArrayList<>(colors);
        firePropertyChange("colors", old, getColors());
    }

    public List<Color> getColors() {
        return new ArrayList<>(colors);
    }
}

// a custom SwatchChooserPanel which takes and listens to the tracker changes
public class MySwatchChooserPanel ... {

   ColorTracker tracker;

   public void setColorTracker(....) {
       // uninstall old tracker 
       ....
       // install new tracker
       this.tracker = tracker;
       if (tracker != null) 
           tracker.addPropertyChangeListener(.... );
       updateRecentSwatchPanel()
   }

   /** 
    * A method updating the recent colors in the swatchPanel
    * This is called whenever necessary, specifically after building the panel,
    * on changes of the tracker, from the mouseListener
    */
   protected void updateRecentSwatchPanel() {
       if (recentSwatchPanel == null) return;
       recentSwatchPanel.setMostRecentColors(tracker != null ? tracker.getColors() : null);
   }

// the mouseListener which updates the tracker and triggers the doubleClickAction
// if available
class MainSwatchListener extends MouseAdapter implements Serializable {
    @Override
    public void mousePressed(MouseEvent e) {
        if (!isEnabled())
            return;
        if (e.getClickCount() == 2) {
            handleDoubleClick(e);
            return;
        }

        Color color = swatchPanel.getColorForLocation(e.getX(), e.getY());
        setSelectedColor(color);
        if (tracker != null) {
            tracker.addColor(color);
        } else {
            recentSwatchPanel.setMostRecentColor(color);
        }
    }

    /**
     * @param e
     */
    private void handleDoubleClick(MouseEvent e) {
        if (action != null) {
            action.actionPerformed(null);
        }
    }
}


} 

// client code can install the custom panel on a JFileChooser, passing in a tracker
private JColorChooser createChooser(ColorTracker tracker) {
    JColorChooser chooser = new JColorChooser();
    List<AbstractColorChooserPanel> choosers = 
            new ArrayList<>(Arrays.asList(chooser.getChooserPanels()));
    choosers.remove(0);
    MySwatchChooserPanel swatch = new MySwatchChooserPanel();
    swatch.setColorTracker(tracker);
    swatch.setAction(doubleClickAction);
    choosers.add(0, swatch);
    chooser.setChooserPanels(choosers.toArray(new AbstractColorChooserPanel[0]));
    return chooser;
}

doubleClick の処理について: swatchChooser を拡張してアクションを実行し、必要に応じて mouseListener からそのアクションを呼び出します。

于 2012-06-18T10:07:29.543 に答える
2

メソッドを使用できますJColorChooser.createDialog- パラメータの 1 つはJColorChooser. の静的インスタンスを使用して、JColorChooserそれを にしDialog modalます。一度に表示されるカラー チューザーは 1 つだけです。

このcreateDialogメソッドはActionListeners、[OK] ボタンと [キャンセル] ボタンのパラメーターとしても受け取ります。したがって、実際にリスナーを管理する必要はありません。もちろん、これはアプリの呼び出し全体で最近の色を保持するのではなく、現在のアプリで最近の色を保持するだけです。

于 2016-12-23T18:32:43.410 に答える