首页 > 解决方案 > 更改 JColorChooser 的预览面板

问题描述

目标是从此更改预览部分:

在此处输入图像描述

对于这样的情况,预览区域有一个边框,背景中有一个实心框和“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 部分是否可以为空(空白),但它没有影响,这让我想知道 setPreviewPanel() 是否是正确的调用。

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

问题 :

有没有改变颜色选择器预览部分的例子?

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

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

标签: javacolorsjcolorchooser

解决方案


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

JColorChooser 示例 GUI 1

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

JColorChooser 示例 GUI 2

这是修改后的JColorChooser.

JColorChooser 示例 GUI 3

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

JColorChooser 示例 GUI 4

然后将主要的背景颜色更改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;
        }

    }

}

推荐阅读