java - 使用 JComboBox Java Swing 选择颜色

标签 java swing colors jcombobox

我有一个 JComboBox,我希望用户可以在其中选择颜色。 JComboBox 只显示颜色,没有任何文本。我想出了这个解决方案。请告诉我这是好事还是应该避免以及为什么。一般来说,我是 Swing 和 Java 的新手,所以请耐心等待 :)

public class ToolBar{
    private MainFrame mainFrame;

    public ToolBar (MainFrame mainFrame) {
        this.mainFrame = mainFrame;
    }

    public JPanel getToolBar(){

        JPanel toolbarPanel = new JPanel(new FlowLayout(FlowLayout.LEADING,2,2));
        toolbarPanel.setPreferredSize(new Dimension(mainFrame.getScreenWidth(),60));
        toolbarPanel.setBorder(BorderFactory.createLineBorder(Color.gray));

        JButton fillButton = new JButton("Fill: ");
        fillButton.setPreferredSize(new Dimension(60,20));
        //fillButton.setBackground(Color.red);
        toolbarPanel.add(fillButton);

        String[] test = {" ", " " , " " , " " , " " , " "};
        JComboBox colorBox = new JComboBox(test);
        colorBox.setMaximumRowCount(5);
        colorBox.setPreferredSize(new Dimension(50,20));
        colorBox.setRenderer(new MyCellRenderer());
        toolbarPanel.add(colorBox);

        return toolbarPanel;
    }
    class MyCellRenderer extends JLabel implements ListCellRenderer {  
         public MyCellRenderer() {  
             setOpaque(true);  
         }  
         public Component getListCellRendererComponent(  
             JList list,  
             Object value,  
             int index,  
             boolean isSelected,  
             boolean cellHasFocus)  
         {  
             setText(value.toString()); 
             switch (index) {
                case 0:  setBackground(Color.white);
                break;
                case 1:  setBackground(Color.red);
                break;
                case 2:  setBackground(Color.blue);
                break;
                case 3:  setBackground(Color.yellow);
                break;
                case 4:  setBackground(Color.green);
                break;
                case 5:  setBackground(Color.gray);
                break;
             }
             return this;  
         }  
    }
}

这工作正常。它在 JComboBox 中以不同的颜色显示空的选择元素。问题是当用户选择颜色时,JComboBox 中选择的颜色不会改变。我应该添加哪几行代码以及在哪里添加,以便当用户从列表中选择颜色时,该颜色会显示在 JComboBox 字段中?

我尝试了一些解决方案,但结果是,当用户在 JComboBox 中选择颜色时,总是会变为灰色...

我查看了几个类似的问题,但我无法弄清楚选择完成后哪部分代码正在处理 JComboBox 颜色的变化...

最佳答案

试试这个,应该可以。您必须重写 setBackground... 因为内部机制使用当前外观和感觉的默认颜色:

Color[] colors={Color.white,Color.red,Color.blue,Color.green};
JComboBox colorBox = new JComboBox(colors);
colorBox.setMaximumRowCount(5);
colorBox.setPreferredSize(new Dimension(50,20));
colorBox.setRenderer(new MyCellRenderer());

和 ListCellRender:

class MyCellRenderer extends JButton implements ListCellRenderer {  
     public MyCellRenderer() {  
         setOpaque(true); 

     }
     boolean b=false;
    @Override
    public void setBackground(Color bg) {
        // TODO Auto-generated method stub
         if(!b)
         {
             return;
         }

        super.setBackground(bg);
    }
     public Component getListCellRendererComponent(  
         JList list,  
         Object value,  
         int index,  

         boolean isSelected,  
         boolean cellHasFocus)  
     {  

         b=true;
         setText(" ");           
         setBackground((Color)value);        
         b=false;
         return this;  
     }  
}

关于java - 使用 JComboBox Java Swing 选择颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18830098/

相关文章:

java - 尝试在空对象引用上调用虚拟方法 'android.view.Window$Callback android.view.Window.getCallback()'

java - 在自定义键的情况下,如何为自定义分区程序设置 numReduceTask

java - 混合使用 JavaFX 和 Swing

Windows API 彩色输出到 Powershell/cmd.exe 中的标准输出

Java Thread Serialization,为什么序列化的Thread Object可以启动

java - 如何将重音字符传递给 REST API(Github 问题)?

css - 如何测试正在开发的网页的视觉可访问性?

vb.net - 如何使用 vb.net 获取 X、Y 处像素的颜色

java - 借鉴Java重量级swing组件

Java Swing简单中心的JPanel在其他JPanel中