【问题标题】:How to display the color selected in my combo box如何显示在我的组合框中选择的颜色
【发布时间】:2013-04-14 03:11:27
【问题描述】:

所以我正在尝试制作一个漂亮的窗口来显示从组合框中选择的颜色。但是我制作了窗口和组合框,由于某种原因我的颜色没有显示。谁能帮帮我?

据我所知,我的组合框位于窗口顶部。我想让它显示在颜色下方。

import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;

class Colors extends JFrame implements ItemListener
{
    Choice chooseColor = new Choice();
    Label lblQts = new Label("Choose color you like : ");

    public Colors(String title)
    {
        super(title);
        setLayout(new FlowLayout());
        chooseColor.addItem("red");
        chooseColor.addItem("green");
        chooseColor.addItem("blue");

        add(lblQts);
        add(chooseColor);

        chooseColor.addItemListener(this);
    }   

    public void itemStateChanged(ItemEvent e)
    {   
        String c;
        Color color;
        c = chooseColor.getSelectedItem();
        color=Color.getColor(c);

        setBackground(color);
    }


}


public static void main(String[] args)
{
    Colors objColor = new Colors("Color Chooser");
    objColor.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    objColor.setSize(400,400);
    objColor.setVisible(true);
}

【问题讨论】:

  • 正如我在您上一篇文章中所建议的,您需要在组合框中添加一个Color 对象,并且您需要创建一个自定义渲染器。您不能只添加一个字符串并期望它神奇地代表一种颜色。
  • 为什么使用 AWT Choice 类而不是 Swing JComboBox ?
  • 不要混合使用轻量和重量的组件,这只会扰乱 z 顺序并且永远不会结束
  • 因为我真的很困惑如何做到这一点。
  • 你是什么意思?您获得了 Swing 教程的链接,其中包含使用 JComboBox 的工作示例。那么你为什么要组成一个不同的组件来使用???这就是你有问题的原因。您没有按照教程中的工作代码进行操作。

标签: java


【解决方案1】:

让我们暂时假设您确实应该使用 Swing API 而不是 AWT API(并且您只是在学习,我认为这是一个不错的假设)。

您可以执行以下操作...

基本上。我有 JComboBox 和自定义 ListCellRendererActionListener

ListCellRenderer 以我想要的方式呈现项目,ActionListener 侦听器用于更改组合框。

当一个新的item被选中时,它会根据选中的item改变组合框的背景。

这里展示的概念对于理解 Swing(以及一般的 Java)至关重要

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
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.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestComboBox08 {

    public static void main(String[] args) {
        new TestComboBox08();
    }

    public TestComboBox08() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            final JComboBox cb = new JComboBox();
            cb.addItem(new SelectableColor("Red", Color.RED));
            cb.addItem(new SelectableColor("Green", Color.GREEN));
            cb.addItem(new SelectableColor("Blue", Color.BLUE));
            cb.setRenderer(new ColorCellRenderer());
            add(cb);
            cb.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    Object value = cb.getSelectedItem();
                    if (value instanceof SelectableColor) {
                        cb.setBackground(((SelectableColor)value).getColor());
                    } else {
                        cb.setBackground(null);
                    }
                }
            });
            cb.setSelectedItem(null);
        }

    }

    public class SelectableColor {
        private String name;
        private Color color;

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

        public String getName() {
            return name;
        }

        public Color getColor() {
            return color;
        }

    }

    public class ColorCellRenderer extends DefaultListCellRenderer {

        @Override
        public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            if (value instanceof SelectableColor) {
                SelectableColor sc = (SelectableColor) value;
                if (!isSelected) {
                    setBackground(sc.getColor());
                    setOpaque(true);
                }
                setText(sc.getName());
            }
            return this;
        }

    }

}

你真的应该熟悉Creating A UI with Swing。如果这超出了您的想象,请从 Trails 开始介绍基础知识

【讨论】:

  • 哇,很明显,我在这项工作上不知所措。我想我需要阅读为我提供的一些资料。感谢您为此任务付出的所有努力和投入。
【解决方案2】:

您需要设置 contentPane 的背景,而不是 JFrame 背景。 然后,您不能使用Color.getColor 来检索这种情况下的颜色对象。见this

这是工作代码:

import java.awt.Choice;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Label;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.lang.reflect.Field;

import javax.swing.JFrame;

public class Colors  extends JFrame implements ItemListener

{
    Choice chooseColor = new Choice();
    Label lblQts = new Label("Choose color you like : ");

    public Colors (String title) {
        super(title);
        setLayout(new FlowLayout());
        chooseColor.addItem("red");
        chooseColor.addItem("green");
        chooseColor.addItem("blue");

        add(lblQts);
        add(chooseColor);

        chooseColor.addItemListener(this);
    }

    public void itemStateChanged(ItemEvent e) {
        String c;
        Color color;
        c = chooseColor.getSelectedItem();              
        try {
            Field field = Class.forName("java.awt.Color").getField(c);
            color = (Color)field.get(null);
        } catch (Exception ex) {
            color = null; // Not defined
        }    
        getContentPane().setBackground(color);

    }

    public static void main(String[] args) {

        Colors  objColor = new Colors ("Color Chooser");
        objColor.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        objColor.setSize(400, 400);
        objColor.setVisible(true);

    }
}

【讨论】:

  • 为什么还要考虑反射呢?为什么不简单地将String 值映射到具有某种MapColor
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-01
  • 2021-10-24
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
相关资源
最近更新 更多