Swing/SaveRestoreRecentSwatch の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/SaveRestoreRecentSwatch へ行く。
- Swing/SaveRestoreRecentSwatch の差分を削除
--- category: swing folder: SaveRestoreRecentSwatch title: JColorChooserのSwatchesタブに配置されたRecentカラーパレットを保存、復元する tags: [JColorChooser, JPanel] author: aterai pubdate: 2023-08-21T02:00:07+09:00 description: JColorChooserのサンプル(Swatches)タブに配置されている最新(Recent)カラーパレットを保存、復元可能になるよう設定します。 image: https://drive.google.com/uc?id=1TgGl797HaTynH4nyLDgHODJ8fj7HbJ4Y --- * 概要 [#summary] `JColorChooser`のサンプル(`Swatches`)タブに配置されている最新(`Recent`)カラーパレットを保存、復元可能になるよう設定します。 #download(https://drive.google.com/uc?id=1TgGl797HaTynH4nyLDgHODJ8fj7HbJ4Y) * サンプルコード [#sourcecode] #code(link){{ RecentSwatchPanel switchPanel = new RecentSwatchPanel(); switchPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); switchPanel.colors[0] = Color.RED; switchPanel.colors[1] = Color.GREEN; switchPanel.colors[2] = Color.BLUE; JButton button = new JButton("open JColorChooser"); button.addActionListener(e -> { JColorChooser cc = new JColorChooser(); AbstractColorChooserPanel[] panels = cc.getChooserPanels(); List<AbstractColorChooserPanel> choosers = new ArrayList<>(Arrays.asList(panels)); List<AbstractColorChooserPanel> choosers = new ArrayList<>(Arrays.asList(panels)); choosers.remove(0); MySwatchChooserPanel swatch = new MySwatchChooserPanel(); swatch.addPropertyChangeListener("ancestor", event -> { Color[] colors = swatch.recentSwatchPanel.colors; if (event.getNewValue() == null) { System.arraycopy( colors, 0, switchPanel.colors, 0, colors.length); } else { System.arraycopy( switchPanel.colors, 0, colors, 0, colors.length); } }); choosers.add(0, swatch); cc.setChooserPanels(choosers.toArray(new AbstractColorChooserPanel[0])); ColorTracker ok = new ColorTracker(cc); Component parent = getRootPane(); String title = "JColorChooser"; JDialog dialog = JColorChooser.createDialog( parent, title, true, cc, ok, null); dialog.addComponentListener(new ComponentAdapter() { @Override public void componentHidden(ComponentEvent e) { ((Window) e.getComponent()).dispose(); } }); dialog.setVisible(true); switchPanel.repaint(); Color color = ok.getColor(); if (color != null) { label.setBackground(color); } }); }} * 解説 [#explanation] - `JColorChooser`をシリアライズしてもサンプル(`Swatches`)タブで使用される最新(`Recent`)カラーパレットは保存、復元不可(未対応?) - また、サンプル(`Swatches`)タブで使用される`DefaultSwatchChooserPanel`はパッケージプライベートなので、これをコピーして`MySwatchChooserPanel`を作成 -- 最新(`Recent`)カラーパレット用の`RecentSwatchPanel`もパッケージプライベートなのでこれをパブリックに変更し、外部から操作可能に変更 - `JColorChooser#setChooserPanels(...)`で`MySwatchChooserPanel`を使用するサンプル(`Swatches`)パネルを差し替え -- [https://stackoverflow.com/questions/10793916/jcolorchooser-save-restore-recent-colors-in-swatches-panel java - JColorChooser: Save/restore recent colors in Swatches panel - Stack Overflow] - サンプル(`Swatches`)パネルに`PropertyChangeListener`を追加: -- 親パネルへの追加イベントで最新(`Recent`)カラーパレットへの色配列復元を実行 -- 親パネルからの削除イベントで最新(`Recent`)カラーパレットからの色配列取得を実行 * 参考リンク [#reference] - [https://stackoverflow.com/questions/10793916/jcolorchooser-save-restore-recent-colors-in-swatches-panel java - JColorChooser: Save/restore recent colors in Swatches panel - Stack Overflow] * コメント [#comment] #comment #comment