如何更改 JComboBox 中的颜色格式?

How to change format of color in JComboBox?

我正在训练 GUI,但遇到了字符串格式问题。不明白如何以用户可读的格式显示列表中的颜色?

  public static void main(String[] args) {

        JFrame jframe = getFrame();

        jframe.setTitle("Background color");

        Toolkit toolkit = Toolkit.getDefaultToolkit();

        Dimension dimension = toolkit.getScreenSize();

        jframe.setBounds(dimension.width/2-250, dimension.height/2-150, 500, 300);

        JPanel jpanel = new JPanel();

        JButton setColor = new JButton("Set Color");

        Color colors[] = {Color.red, Color.green, Color.blue, Color.black};
        
        JComboBox<Color> selector = new JComboBox<>(colors);

        setColor.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jpanel.setBackground((Color)selector.getSelectedItem());
            }
        });

        jpanel.add(selector);

        jpanel.add(setColor);

        jframe.add(jpanel);
        
      }

      public static JFrame getFrame() {
        JFrame jframe = new JFrame();
        jframe.setVisible(true);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        return jframe;
      }
  }

这是我的输出:

所以,我希望显示颜色的名称而不是 java.awt.Color[.....]

提前致谢!

默认情况下,JComboBox 显示由其列表中的对象的 toString 方法编辑的值 return。由于您的 JComboBox 包含 Color 个对象,您会看到 return 由 class java.awt.Color.

的方法 toString 编辑的值

如果要显示颜色名称,则需要创建一个自定义 class 来存储颜色名称,作为 StringColor 对象.然后你需要覆盖自定义 class 的 toString 方法到 return 只是颜色的名称。在下面的代码中,自定义 class 被命名为 NamedColor.

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ColorSet {

    public static void main(String[] args) {
        JFrame jframe = new JFrame("Background color");
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Dimension dimension = toolkit.getScreenSize();
        jframe.setBounds(dimension.width / 2 - 250, dimension.height / 2 - 150, 500, 300);
        JPanel jpanel = new JPanel();
        JButton setColor = new JButton("Set Color");
        NamedColor colors[] = {new NamedColor(Color.red, "RED"),
                               new NamedColor(Color.green, "GREEN"),
                               new NamedColor(Color.blue, "BLUE"),
                               new NamedColor(Color.black, "BLACK")};
        JComboBox<NamedColor> selector = new JComboBox<>(colors);
        setColor.addActionListener(
                  e -> jpanel.setBackground(((NamedColor) selector.getSelectedItem()).getColor()));
        jpanel.add(selector);
        jpanel.add(setColor);
        jframe.add(jpanel);
        jframe.setVisible(true);
    }
}

class NamedColor {
    private Color color;
    private String name;

    public NamedColor(Color color, String name) {
        this.color = color;
        this.name = name;
    }

    public Color getColor() {
        return color;
    }

    public String toString() {
        return name;
    }
}

关于上述代码的注释。

  • ActionListener 接口是使用 lambda expression
  • 实现的
  • 只有在添加了所有组件后,才应调用 class JFrame 的方法 setVisible