更改 JColorChooser 的预览面板

Posted

技术标签:

【中文标题】更改 JColorChooser 的预览面板【英文标题】:Change Preview Panel for JColorChooser 【发布时间】:2020-08-28 08:03:36 【问题描述】:

目标是从这里更改预览部分:

像这样的预览区域有一个边框,背景中有一个实心框和“Hello World”字符串,该字符串会更改为为预览选择的颜色。

从 java2 中的这个示例开始,它简单地显示了 JColorChooser。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;

public class ColorChooserSample 
  public static void main(String args[]) 
    JFrame f = new JFrame("JColorChooser Sample");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Container content = f.getContentPane();
    final JButton button = new JButton("Pick to Change Background");

    ActionListener actionListener = new ActionListener() 
      public void actionPerformed(ActionEvent actionEvent) 
        Color initialBackground = button.getBackground();
        JColorChooser jColorChooser = new JColorChooser();
        jColorChooser.setPreviewPanel(null);
        Color background = jColorChooser.showDialog(null,
            "JColorChooser Sample", initialBackground);
        if (background != null) 
          button.setBackground(background);
        
      
    ;
    button.addActionListener(actionListener);
    content.add(button, BorderLayout.CENTER);
    f.setSize(300, 200);
    f.setVisible(true);
  

只是为了看看我是否可以影响预览区域,我从这里修改了原始代码:

    Color background = JColorChooser.showDialog(null,
        "JColorChooser Sample", initialBackground);

到这里:

        JColorChooser jColorChooser = new JColorChooser();
        jColorChooser.setPreviewPanel(null);
        Color background = jColorChooser.showDialog(null,
            "JColorChooser Sample", initialBackground);

基本上,这是为了尝试查看 Preview 部分是否可以为 null(空白),但它没有任何影响,这让我想知道 setPreviewPanel() 是否是正确的调用。

另外,代码更改后会出现此警告:应以静态方式访问 JColorChooser 类型的静态方法 showDialog(Component, String, Color)

问题:

是否有任何改变颜色选择器预览部分的示例?

为什么上面的 null 不起作用。

如果警告表明应该以静态方式访问 JColorChooser,那么实际上如何调用 setPreviewPanel()?

【问题讨论】:

【参考方案1】:

修改JColorChooser预览面板的例子并不多。我找到了四个例子。除了JColorChooser 的Javadoc,我还创建了一个修改后的JColorChooser 预览面板的工作示例。

我修改了原来的JFrame/JPanel,改变了JPanel的背景颜色,这样更容易看到结果。

这是修改后的JColorChooser

这里我将预览JPanel的背景颜色改为黄色。

然后将主 JPanel 的背景颜色更改为黄色。

这是代码。我将代码分成小块的方法和类,这样我就可以一次专注于 GUI 数据的一部分。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class ColorChooserSample implements Runnable

    public static void main(String args[]) 
        SwingUtilities.invokeLater(
                new ColorChooserSample());
    

    private JPanel panel;

    @Override
    public void run() 
        JFrame frame = new JFrame(
                "JColorChooser Sample");
        frame.setDefaultCloseOperation(
                JFrame.EXIT_ON_CLOSE);

        panel = new JPanel();
        panel.setPreferredSize(new Dimension(300, 200));
        JButton button = new JButton(
                "Pick to Change JPanel Background");
        button.addActionListener(new ColorListener());
        panel.add(button);

        frame.add(panel, BorderLayout.CENTER);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    

    public void setJPanelBackground(Color color) 
        panel.setBackground(color);
        panel.repaint();
    

    public class ColorListener implements 
            ActionListener, ChangeListener 

        private JColorChooser chooser;

        private JPanel previewPanel;

        @Override
        public void actionPerformed(
                ActionEvent actionEvent) 
            Color backgroundColor = showDialog(panel, 
                    "Set JPanel Background", 
                    panel.getBackground());
            setJPanelBackground(backgroundColor);
        

        private Color showDialog(Component component, 
                String title, Color initialColor) 
                        throws HeadlessException 
            chooser = new JColorChooser(initialColor);
            chooser.getSelectionModel()
                .addChangeListener(this);

            // configuring color chooser panel
            previewPanel = new JPanel();
            previewPanel.setBackground(initialColor);
            JLabel label = new JLabel("Hello World!");
            previewPanel.add(label);
            chooser.setPreviewPanel(previewPanel);

            // creating dialog
            ColorTracker ok = new ColorTracker(chooser);
            JDialog dialog = JColorChooser.createDialog(
                    component, title, true, chooser, 
                    ok, null);
            dialog.setVisible(true);
            return ok.getColor();
        

        @Override
        public void stateChanged(ChangeEvent event) 
            Color newColor = chooser.getColor();
            previewPanel.setBackground(newColor);
        

    

    private class ColorTracker implements ActionListener 

        private Color color;

        private JColorChooser chooser;

        public ColorTracker(JColorChooser chooser) 
            this.chooser = chooser;
        

        @Override
        public void actionPerformed(ActionEvent event) 
            color = chooser.getColor();
        

        public Color getColor() 
            return color;
        

    


【讨论】:

谢谢,我只是来这里发布的,看来我需要进行 createDialog() 调用,而不是你已经完成的 showDialog() 调用。

以上是关于更改 JColorChooser 的预览面板的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 Eclipse 的 ADT 插件中更改 XML 布局预览面板的大小(宽度 + 高度)?

在 Java 中自定义默认 AbstractColorChooserPanel

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

如何更改 NetBeans GUI Designer Preview 中的外观?

JColorChooser 中的异常行为(或可能的错误)