繁体   English   中英

JComboBox自定义ListCellRenderer

[英]JComboBox custom ListCellRenderer

我对JComboBox自定义ListCellRenderer有问题。 我想创建一个组合框,让其在4种颜色之间进行选择。 我希望组合框通过JPanel的“列表”显示颜色,并用所需的颜色显示背景。 我设法获得了想要的东西,唯一的问题是,当我单击项目时,此颜色更改为灰色,不再显示原始颜色。 这里的代码:

package custom_renderer_combobox;

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
import javax.swing.JComboBox;

public class gui extends JFrame{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private Color[] colors={Color.BLACK,Color.blue,Color.cyan,Color.GRAY,Color.green,Color.MAGENTA,Color.ORANGE,Color.RED};
    gui(){
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setSize(new Dimension(400,400));
        getContentPane().setLayout(null);

        JComboBox<JPanel> comboBox = new JComboBox<JPanel>();
        comboBox.setRenderer(new myRenderer());
        comboBox.setBounds(36, 59, 211, 20);
        getContentPane().add(comboBox);
        for(int i=0;i<colors.length;i++){
            JPanel temp=new JPanel();
            temp.setOpaque(true);
            temp.setBackground(colors[i]);
            comboBox.addItem(temp);
        }
        comboBox.repaint();
    }

    class myRenderer implements ListCellRenderer{


        @Override
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            return ((JPanel) value);
        }

    }
}

这里有一些照片:

图片

我认为问题出在自定义渲染器中,有人可以告诉我我该怎么做吗?

这是您的示例,如何使用渲染器和组合框

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import javax.swing.plaf.basic.BasicComboBoxRenderer;

/**
 * <code>ColorTest</code>.
 */
public class ColorTest {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ColorTest();
            }
        });
    }
    /**
     * 
     */
    public ColorTest() {
        JFrame frm = new JFrame("Test");
        final JComboBox<ColorData> cmb = new JComboBox<>(ColorData.values());
        cmb.setRenderer(new ColorRenderer());
        final JPanel p = new JPanel();
        p.setOpaque(true);
        p.setPreferredSize(new Dimension(200, 100));
        ActionListener l = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                ColorData cd = (ColorData) cmb.getSelectedItem();
                if (cd != null) {
                    p.setBackground(cd.getColor());
                }
            }
        };
        cmb.addActionListener(l);
        l.actionPerformed(null); // update current background
        frm.add(cmb, BorderLayout.NORTH);
        frm.add(p);
        frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frm.pack();
        frm.setLocationRelativeTo(null);
        frm.setVisible(true);
    }

    private static class ColorRenderer extends BasicComboBoxRenderer {
        @Override
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            if (value instanceof ColorData) {
                BufferedImage img = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
                Graphics g = img.createGraphics();
                g.setColor(((ColorData) value).getColor());
                g.fillRect(0, 0, 15, 15);
                g.dispose();
                setIcon(new ImageIcon(img));
            }
            return this;
        }
    }

    private static enum ColorData {
        BLACK("Black", Color.BLACK), 
        BLUE("Blue", Color.BLUE), 
        GREEN("Green", Color.GREEN), 
        RED("Red", Color.RED);
        private String name;

        private Color color;

        private ColorData(String aName, Color aColor) {
            name = aName;
            color = aColor;
        }

        public String getName() {
            return name;
        }

        public Color getColor() {
            return color;
        }

        @Override
        public String toString() {
            return getName();
        }
    }
}

要添加一些新颜色,您需要向ColorData枚举中添加适当的常量。

为了更快一点,您可以创建自己的JPanel,它将在构造函数中使用背景色,并阻止更改背景:

public class ColorPanel extends JPanel {

    public ColorPanel(Color color) {
        super.setBackground(color);
    }

    @Override
    public void setBackground(Color bg) {
        //blocked changing
    }

}

并且在您的代码中,您必须进行更改

        JPanel temp = new ColorPanel(colors[i]);
        temp.setOpaque(true);
        comboBox.addItem(temp);
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;

import javax.swing.DefaultCellEditor;
import javax.swing.DefaultListCellRenderer;
import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListCellRenderer;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;

class ComboTableCellRenderer implements ListCellRenderer, TableCellRenderer {
  DefaultListCellRenderer listRenderer = new DefaultListCellRenderer();

  DefaultTableCellRenderer tableRenderer = new DefaultTableCellRenderer();

  private void configureRenderer(JLabel renderer, Object value) {
    if ((value != null) && (value instanceof Color)) {
      if (value.equals(Color.red)) {
            renderer.setText("0");
        } else if(value.equals(Color.orange)) {
            renderer.setText("10");
        }
      else if(value.equals(Color.yellow)) {
            renderer.setText("20");
        }
      else if(value.equals(Color.green)) {
            renderer.setText("30");
        }
      else if(value.equals(Color.white)) {
            renderer.setText("N/A");
        }
      renderer.setBackground((Color)value);
    } else {
      renderer.setText((String) value);
    }
  }

  public Component getListCellRendererComponent(JList list, Object value, int index,
      boolean isSelected, boolean cellHasFocus) {
    listRenderer = (DefaultListCellRenderer) listRenderer.getListCellRendererComponent(list, value,
        index, isSelected, cellHasFocus);
    configureRenderer(listRenderer, value);
    return listRenderer;
  }

  public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
      boolean hasFocus, int row, int column) {
    tableRenderer = (DefaultTableCellRenderer) tableRenderer.getTableCellRendererComponent(table,
        value, isSelected, hasFocus, row, column);
    configureRenderer(tableRenderer, value);
    return tableRenderer;
  }
}

class ColorTableModel extends AbstractTableModel {

  Object rowData[][] = {
      { "1","","","", Color.red, "30" },
      { "2","","","", Color.red, "30" },
      { "3","","","", Color.red, "30" },
      { "4","","","", Color.red, "30" },
      { "5","","","", Color.red, "30" }, };

  String columnNames[] = { "Index","Item","Reason","Image","Marks","Allocated Marks" };

  public int getColumnCount() {
    return columnNames.length;
  }

  public String getColumnName(int column) {
    return columnNames[column];
  }

  public int getRowCount() {
    return rowData.length;
  }

  public Object getValueAt(int row, int column) {
    return rowData[row][column];
  }

  public Class getColumnClass(int column) {
    return (getValueAt(0, column).getClass());
  }

  public void setValueAt(Object value, int row, int column) {
    rowData[row][column] = value;
  }

  public boolean isCellEditable(int row, int column) {
    return (column != 0);
  }
}``

Main.java

import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;

public class Main {

public static void main(String[] args) {
    // TODO code application logic here
    Color choices[] = { Color.red, Color.yellow, Color.green, Color.white, Color.orange };
ComboTableCellRenderer renderer = new ComboTableCellRenderer();
JComboBox comboBox = new JComboBox(choices);
comboBox.setRenderer(renderer);

TableCellEditor editor = new DefaultCellEditor(comboBox);

JFrame frame = new JFrame("Editable Color Table");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
TableModel model = new ColorTableModel();
JTable table = new JTable(model);
TableColumn column = table.getColumnModel().getColumn(4);
column.setCellRenderer(renderer);
column.setCellEditor(editor);

JScrollPane scrollPane = new JScrollPane(table);
frame.add(scrollPane, BorderLayout.CENTER);
frame.setSize(400, 150);
frame.setVisible(true);


}

}

此代码用于jtable jcombobox颜色根据值的变化而变化。 这正在工作100%希望它将为您服务!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM