如何从 JColorChooser 获取颜色窗格并在我自己的窗口中使用它?

Posted

技术标签:

【中文标题】如何从 JColorChooser 获取颜色窗格并在我自己的窗口中使用它?【英文标题】:How to get the Color pane from JColorChooser and use it in my own window? 【发布时间】:2020-03-20 10:31:27 【问题描述】:

我是 Java 和 Java swing 的新手。

我只需要提取颜色窗格并在我自己的窗口中从该窗格中获取颜色。

基本上,我想删除默认 ColorPanel 中其他不必要的组件。 我成功移除了其他面板和滑块。但不会更进一步。

JColorChooser

【问题讨论】:

我不知道您为什么需要这样做,但我建议您制作自己的组件,因为与它的所有交互都会更容易。这并不难,这取决于你想用它做什么。 是的,我明白了。我在 Java 和编写图形代码部分方面非常新手。因此,我也在寻找任何解决方法。最后,我得到了一个,不得不修改太多。现在,我意识到,我会按照你的建议把时间花在学习和写作上。 【参考方案1】:

这很困难并且需要一些 AWT/Swing hack(如 Robot 类),但有可能。我不建议您使用此代码,但如果需要...

import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Robot;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

import javax.swing.JColorChooser;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

/**
 * <code>ChooserTryout</code>.
 */
public class ChooserTryout 

    public static void main(String[] args) 
        try 
            Robot robot = new Robot();
            SwingUtilities.invokeLater(() -> new ChooserTryout().startUI(robot));
         catch (AWTException e) 
            e.printStackTrace();
        
    

    public void startUI(Robot robot) 
        JFrame frm = new JFrame("Color test");
        JColorChooser chooser = new JColorChooser();
        JLabel label = new JLabel("Here is your actual color");
        label.setOpaque(true);
        List<JComponent> comps =
                getAllChildrenOfClass(chooser, JComponent.class, c -> c.getClass().getName().contains("DiagramComponent"));
        JComponent c = comps.get(3);
        c.setPreferredSize(new Dimension(300, 300));
        c.addMouseListener(new MouseAdapter() 
            @Override
            public void mousePressed(MouseEvent e) 
                Point p = c.getLocationOnScreen();
                p.translate(e.getX(), e.getY());
                Color color = robot.getPixelColor(p.x, p.y);
                System.out.println("You've clicked color: " + color);
                label.setForeground(color);
            ;
        );
        frm.add(c);
        frm.add(label, BorderLayout.SOUTH);
        frm.pack();
        frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frm.setLocationRelativeTo(null);
        frm.setVisible(true);
    

    /**
     * Searches for all children of the given component which are instances of the given class and satisfies the given condition.
     *
     * @param aRoot start object for search. May not be null.
     * @param aClass class to search. May not be null.
     * @param condition condition to be satisfied. May not be null.
     * @param <E> class of component.
     * @return list of all children of the given component which are instances of the given class. Never null.
     */
    public static <E> List<E> getAllChildrenOfClass(Container aRoot, Class<E> aClass, Predicate<E> condition) 
        final List<E> result = new ArrayList<>();
        final Component[] children = aRoot.getComponents();
        for (final Component c : children) 
            if (aClass.isInstance(c) && condition.test(aClass.cast(c))) 
                result.add(aClass.cast(c));
            
            if (c instanceof Container) 
                result.addAll(getAllChildrenOfClass((Container) c, aClass, condition));
            
        
        return result;
    


【讨论】:

谢谢你的努力!我一定会调查的。无论如何,我在他重写颜色面板的地方使用了这段代码。 ***.com/a/44245611/4502126

以上是关于如何从 JColorChooser 获取颜色窗格并在我自己的窗口中使用它?的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖 JColorChooser 重置按钮?

如何从颜色变量中获取 RGB 值

如何更改 JColorChooser 的 Swatches 组件的颜色?

使用 JColorChooser 绘图

仅 RGB 的 JColorChooser (Java 7)

Java Swing JColorChooser 颜色 RGB 到 sRGB