如何从 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 的 Swatches 组件的颜色?