更改颜色选择器按钮';Java中的背景色

更改颜色选择器按钮';Java中的背景色,java,swing,jbutton,jcolorchooser,Java,Swing,Jbutton,Jcolorchooser,我有一个Java按钮,可以打开JColorChooser对话框。我想根据对话框中选择的颜色更改按钮的颜色。我尝试调用按钮的setBackgroundColor()方法,但在我的例子中没有效果(按钮位于Winsows 7中的JToolBar上)。此外,这个问题表明改变按钮的背景并不是独立于平台的 也许这个问题的答案是首先不要使用按钮。所以,我的问题是:是否有一种方法可以在Java中显示反映所选颜色的“颜色选择器”控件?有点像MS Paint在“用颜色填充”按钮上显示拾取的颜色。从上下文看不太清楚,

我有一个Java按钮,可以打开JColorChooser对话框。我想根据对话框中选择的颜色更改按钮的颜色。我尝试调用按钮的setBackgroundColor()方法,但在我的例子中没有效果(按钮位于Winsows 7中的JToolBar上)。此外,这个问题表明改变按钮的背景并不是独立于平台的


也许这个问题的答案是首先不要使用按钮。所以,我的问题是:是否有一种方法可以在Java中显示反映所选颜色的“颜色选择器”控件?有点像MS Paint在“用颜色填充”按钮上显示拾取的颜色。

从上下文看不太清楚,您是指这种方式(代码示例)还是指
JColorChooser中的
setBackground
或其
JComponents

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

import javax.swing.ComboBoxEditor;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
import javax.swing.border.LineBorder;
import javax.swing.event.EventListenerList;

class ColorComboBoxEditor implements ComboBoxEditor {

    final protected JButton editor;
    private EventListenerList listenerList = new EventListenerList();

    ColorComboBoxEditor(Color initialColor) {
        editor = new JButton("");
        editor.setBackground(initialColor);
        ActionListener actionListener = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                Color currentBackground = editor.getBackground();
                Color color = JColorChooser.showDialog(editor, "Color Chooser", currentBackground);
                if ((color != null) && (currentBackground != color)) {
                    editor.setBackground(color);
                    fireActionEvent(color);
                }
            }
        };
        editor.addActionListener(actionListener);
    }

    @Override
    public void addActionListener(ActionListener l) {
        listenerList.add(ActionListener.class, l);
    }

    @Override
    public Component getEditorComponent() {
        return editor;
    }

    @Override
    public Object getItem() {
        return editor.getBackground();
    }

    @Override
    public void removeActionListener(ActionListener l) {
        listenerList.remove(ActionListener.class, l);
    }

    @Override
    public void selectAll() {
    }

    @Override
    public void setItem(Object newValue) {
        if (newValue instanceof Color) {
            Color color = (Color) newValue;
            editor.setBackground(color);
        } else {
            try {
                Color color = Color.decode(newValue.toString());
                editor.setBackground(color);
            } catch (NumberFormatException e) {
            }
        }
    }

    protected void fireActionEvent(Color color) {
        Object listeners[] = listenerList.getListenerList();
        for (int i = listeners.length - 2; i >= 0; i -= 2) {
            if (listeners[i] == ActionListener.class) {
                ActionEvent actionEvent = new ActionEvent(editor, ActionEvent.ACTION_PERFORMED, color.toString());
                ((ActionListener) listeners[i + 1]).actionPerformed(actionEvent);
            }
        }
    }
}

class ColorCellRenderer implements ListCellRenderer {

    private DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();
    private final static Dimension preferredSize = new Dimension(0, 20);

    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        JLabel renderer = (JLabel) defaultRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        if (value instanceof Color) {
            renderer.setBackground((Color) value);
        }
        if (cellHasFocus || isSelected) {
            renderer.setBorder(new LineBorder(Color.DARK_GRAY));
        } else {
            renderer.setBorder(null);
        }
        renderer.setPreferredSize(preferredSize);
        return renderer;
    }
}

class ColorComboBoxEditorRendererDemo {

    public ColorComboBoxEditorRendererDemo() {
        Color colors[] = {Color.BLACK, Color.BLUE, Color.GREEN, Color.RED, Color.WHITE, Color.YELLOW};
        JFrame frame = new JFrame("Color JComboBox");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JComboBox comboBox = new JComboBox(colors);
        comboBox.setEditable(true);
        comboBox.setRenderer(new ColorCellRenderer());
        Color color = (Color) comboBox.getSelectedItem();
        ComboBoxEditor editor = new ColorComboBoxEditor(color);
        comboBox.setEditor(editor);
        frame.add(comboBox, BorderLayout.NORTH);
        final JLabel label = new JLabel();
        label.setOpaque(true);
        label.setBackground((Color) comboBox.getSelectedItem());
        frame.add(label, BorderLayout.CENTER);
        ActionListener actionListener = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                Color selectedColor = (Color) comboBox.getSelectedItem();
                label.setBackground(selectedColor);
            }
        };
        comboBox.addActionListener(actionListener);
        frame.setSize(300, 200);
        frame.setVisible(true);
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                ColorComboBoxEditorRendererDemo colorComboBoxEditorRendererDemo = new ColorComboBoxEditorRendererDemo();
            }
        });
    } 
}


您有几个选择:

  • 更改相关组件的背景,如@mKorbel中所示

  • 按照@Robin的建议,按下按钮

  • 修改包含按钮的面板的背景,如图所示

  • 实现
    图标
    界面并将实例应用于按钮(或按钮附近),如图所示

从,颜色选择按钮类别:

  • 显示当前选定的颜色
  • 按下时打开JColorChooser对话框
  • 选择颜色时激发事件

谢谢。我实现了图标界面,就像你在上一个链接中建议的那样;例如,这种方法特别通用。