【问题标题】:How to change format of color in JComboBox?如何更改 JComboBox 中的颜色格式?
【发布时间】:2021-10-02 21:20:31
【问题描述】:

我正在训练 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[.....]

提前致谢!

【问题讨论】:

标签: java swing jcombobox tostring


【解决方案1】:

默认情况下,JComboBox 显示其列表中对象的toString 方法返回的值。由于您的JComboBox 包含Color 对象,因此您会看到java.awt.Color 类的方法toString 返回的值。

如果要显示颜色名称,则需要创建一个自定义类,该类将颜色名称存储为StringColor 对象。然后你需要重写自定义类的toString 方法,只返回颜色的名称。在下面的代码中,自定义类被命名为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 实现
  • 只有在添加完所有组件后,才能调用 JFrame 类的方法 setVisible

【讨论】:

    猜你喜欢
    • 2021-05-17
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 2021-02-08
    相关资源
    最近更新 更多