JColorChooser:在“色板”面板中保存/恢复最近的颜色

我在应用程序的不同位置使用JColorchooser 。 面板的多个实例可以调用JColorChooser。
选择器中的“色板”面板具有“最近”颜色区域 ,该区域仅在JColorChooser的每个实例中持续存在。 我希望(a)在我的应用程序中的所有选择器具有相同的“最近”颜色 ,以及(b)将颜色保存到磁盘,以便这些颜色能够在应用程序中保持紧密和重新启动。
(至少(a)可以通过在整个应用程序中使用相同的单个选择器实例来解决,但是这很麻烦,因为我需要非常小心附加的changelisteners,并在各种对话框中添加/删除选择器面板。)

我没有找到任何让我在选择器面板中设置(恢复)这些“最近”颜色的方法。 所以对我来说,实现这一目标的唯一方法似乎是:

  • 序列化并保存/恢复整个选择器(选择器面板?)或
  • 从头开始创建我自己的选择器面板

这是正确的,还是我错过了什么?

BTW:我也想在选择器中检测到双击,但似乎很难找到合适的地方来连接我的鼠标监听器。 我真的需要深入了解选择器面板的内部结构吗? (不,它不能检测同一颜色的第二次单击,因为更改侦听器仅在单击其他颜色时才会触发。)

正如您所注意到的,即使面板本身无法访问,也没有公共API可以访问DefaultSwatchChooserPanel中的最近颜色。

因为你需要一些逻辑/ bean来保存和重置最近的颜色(加上扩展的鼠标交互),滚动你自己的是要走的路。 有关指导,请查看样本面板的实现(咳嗽… c&p您需要的内容并修改您不需要的内容)。 基本上,像

// a bean that keeps track of the colors public static class ColorTracker extends AbstractBean { private List colors = new ArrayList<>(); public void addColor(Color color) { List old = getColors(); colors.add(0, color); firePropertyChange("colors", old, getColors()); } public void setColors(List colors) { List old = getColors(); this.colors = new ArrayList<>(colors); firePropertyChange("colors", old, getColors()); } public List 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 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调用该操作。

您可以使用JColorChooser.createDialog方法 – 其中一个参数是JColorChooser 。 使用JColorChooser的静态实例并使其成为Dialog modal – 这样,一次只显示一个颜色选择器。

createDialog方法还将ActionListeners作为“确定”和“取消”按钮的参数。 因此,不必真正管理听众。 当然,这并没有在应用程序的调用中保持最近的颜色,只是在当前应用程序中保留最近的颜色。