当前位置: 首页 > 面试题库 >

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

解高昂
2023-03-14
问题内容

我在应用程序的各个位置使用 JColorchooser 。面板可以有多个实例,可以调用JColorChooser。
选择器中的“色板”面板具有 “最近”颜色区域 ,该区域仅存在于JColorChooser的每个实例中。我想 (a) 在我的应用程序
中的所有选择器都具有相同的“最近”颜色 ,并且 (b)将颜色保存到磁盘中, 以便这些颜色在关闭并重新启动应用程序后仍然存在。
(至少(a)可以通过在整个应用程序中使用相同的单个选择器实例来解决,但是这有点麻烦,因为我需要非常谨慎地使用附加的变更侦听器,

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

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

这是正确的,还是我缺少了什么?

顺便说一句:我也想检测选择器中的双击,但似乎很难找到合适的位置来附加鼠标侦听器。我真的需要深入研究选择器面板的内部结构吗?(不,检测第二次单击相同颜色是无效的,因为只有在单击另一种颜色后,更改侦听器才会触发。)


问题答案:

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

由于您将需要一些逻辑/
bean来保持和重置最近的颜色(以及扩展的鼠标交互),因此滚动自己的方式是可行的。为了获得一些指导,请看一下样本面板的实现(咳嗽…
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调用该操作。



 类似资料:
  • 颜色面板概述 “颜色”面板(“窗口”>“颜色”)显示当前前景色和背景色的颜色值。使用“颜色”面板中的滑块,可以利用几种不同的颜色模型来编辑前景色和背景色。也可以从显示在面板底部的四色曲线图中的色谱中选取前景色或背景色。“颜色”面板 A. 前景色 B. 背景色 C. 滑块 D. 四色曲线图  当您选择颜色时,“颜色”面板可能显示下列警告: 当选取不能使用 CMYK 油墨打印的颜色时,四色曲线图左上方

  • 问题内容: 我有一个程序,其中有一个按钮可以将背景色更改为红色,而另一个按钮可以将背景色设置为默认。 如何获取面板的默认颜色? 问题答案: 将默认颜色存储到构造函数中的变量中,或在使用其他按钮更改颜色之前将其存储,即: 并在您的默认颜色按钮中:

  • 注意:本文仅适用于 2017 年 4 月之前发行的 Illustrator CC 版本。 从 2017 年 4 月版开始,Illustrator CC 会提供新的颜色主题创建体验。使用新的“Adobe Color 主题”面板,您可以创建或编辑数千个主题,然后将这些主题用在您的项目中。有关详细信息,请参阅使用 Adobe Color 主题扩展。 Adobe® Color® 是基于 Web 的应用程序

  • 我在reactjs初学者,我想复制一个颜色,当我点击颜色。 应该怎么做呢?

  • 注意: Adobe Muse 不再添加新增功能,并将于 2020 年 3 月 26 日停止支持。有关详细信息和帮助,请参阅 Adobe Muse 服务结束页面。 “色板”面板 使用“色板”面板(窗口 > 颜色色板),可以创建和命名颜色、渐变或色调,并将它们快速应用于网站和个别设计元素。色板类似于段落样式和字符样式;对色板进行的任何更改将影响该色板应用于的所有对象。使用色板无需定位和调节各个个别的对

  • 问题内容: 编辑: 给出答案后,我执行了此功能 我的目标是这个。我抓取图片并遍历每个像素,然后抓取其x,y和rgb。 我拥有一个预定义的数组,而不是仅仅抓住rgb,我正在寻找从我抓取的颜色到预定义数组的最接近的匹配项。这里的目标是仅使用预定义数组中的颜色。这是我的颜色数组。 这是我现有的遍历所有内容的代码。 rgb2hex是用户定义的函数,但是我要完成的功能是使用该函数更改该函数以获取最接近的颜色