使用可编辑的组合框

时间:2015-06-10 11:32:54

标签: java swing render jcombobox

我已经为可编辑的JCombobox安装了自定义渲染器,但是我在渲染空字符串方面遇到了问题。 您是否知道如何显示具有正确/相似高度的空项目?或者这是一个Java错误?

请参阅以下示例和差异截图:

expected rendering with a custom renderer

package combo;

import java.awt.Component;
import java.awt.GridLayout;
import java.util.Vector;

import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.SwingUtilities;

public class MyComboBox {

  private final class CustomCellRenderer extends DefaultListCellRenderer {


    private static final long serialVersionUID = 1L;

    @Override
    public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
      super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
      return this;
    }
  }

  private Vector<String> listSomeString = new Vector<String>();
  private JComboBox someComboBox = new JComboBox(listSomeString);
  private JComboBox editableComboBox = new JComboBox(listSomeString);
  private JComboBox non_EditableComboBox = new JComboBox(listSomeString);
  private JFrame frame;

  public MyComboBox() {
    listSomeString.add("");
    listSomeString.add("-");
    listSomeString.add("Snowboarding");
    listSomeString.add("Rowing");
    listSomeString.add("Knitting");
    listSomeString.add("Speed reading");
    someComboBox.setPrototypeDisplayValue("Speed reading");
    someComboBox.setEditable(true);
    editableComboBox.setPrototypeDisplayValue("Speed reading");
    editableComboBox.setEditable(true);
    editableComboBox.setRenderer(new CustomCellRenderer());
    frame = new JFrame();
    frame.setLayout(new GridLayout(0, 1, 10, 10));
    frame.add(someComboBox);
    frame.add(editableComboBox);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setLocation(100, 100);
    frame.pack();
    frame.setVisible(true);
  }

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

      @Override
      public void run() {
        MyComboBox aCTF = new MyComboBox();
      }
    });
  }
}

1 个答案:

答案 0 :(得分:1)

JComboBox不使用DefaultListCellRenderer。如果你打电话

System.out.println(editableComboBox.getRenderer());

您会注意到JComboBox使用的是BasicComboBoxRenderer

您只需将其更改为

即可
private final class CustomCellRenderer extends BasicComboBoxRenderer{
  private static final long serialVersionUID = 1L;

  @Override
  public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
    super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
    return this;
  }
}