2013-04-14 48 views
2

所以我试图做一个漂亮的窗口显示从组合框中选择的颜色。但我得到了窗户和组合框,出于某种原因我的颜色不显示。谁能帮我?如何显示在我的组合框中选择的颜色

另外从我可以告诉,我的组合框是在我的窗口的顶部。我想让它显示在下面的颜色。

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); 
} 
+1

正如我在你上一篇文章中所建议的,你需要添加一个'Color'对象到组合框,你需要创建一个自定义的渲染器。你不能只添加一个字符串,并期望它神奇地代表一种颜色。 – camickr

+1

为什么使用AWT Choice类而不是Swing JComboBox? –

+0

不要混合轻重量组件,这只会与z排序混淆,并且永远不会结束 – MadProgrammer

回答

3

让我们承担,你真的应该使用Swing的API,而不是AWT API片刻(并视为你只是刚开始学习,我认为这是一个体面的假设)。

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

基本上。我有JComboBox定制ListCellRendererActionListener

ListCellRenderer以我想要的方式呈现项目以及ActionListener听众更改组合框。

当选择新项目时,将根据所选项目更改组合框的背景。

这里展示的概念是理解挥杆的关键(和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开始涵盖的基本知识

+0

哇,我很清楚这件作品在我的头上。我想我需要阅读为我提供的一些资源。感谢您在这项任务上的所有努力和投入。 –

1

您需要设置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); 

    } 
} 
+0

为什么要反思?为什么不简单地用某种'Map'将'String'值映射到'Color'? – MadProgrammer

相关问题