设置 TableCellRenderer 在“JComboBox”的值列表顶部添加一个空值

Setting TableCellRenderer adds an empty value atop of value list of `JComboBox`

SCCEE 在这里:

import java.awt.EventQueue;

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;

public class TC extends JFrame{
    public TC(){
        begin();
    }
    private void begin(){
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setTitle("nothing.");
        String[] options = {"One", "Two", "Three"};
        JComboBox<String> combo = new JComboBox<>(options);
        JTable table = new JTable(new Object[2][2], new String[]{"One", "Two"});
        TableColumn col0 = table.getColumnModel().getColumn(0);
        col0.setCellEditor(new DefaultCellEditor(combo));

        class MyRender extends DefaultTableCellRenderer {
            public MyRender() {
            }
            @Override
            public void setValue(Object value) {
                if (value instanceof JComboBox) {
                    setText(((JComboBox) value).getSelectedItem().toString());
                }
            }
        }

        MyRender renderer = new MyRender();
        col0.setCellRenderer(renderer);

        JScrollPane sp = new JScrollPane(table);
        getContentPane().add(sp);

        pack();
        setVisible(true);
    }

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

            @Override
            public void run() {
                TC tc = new TC();

            }

        });
    }
}

我的问题是:设置 TableCellRenderer 会使组合在所有其他值之上选择一个空选项,而没有任何人告诉它这样做。空条目不知从何而来。

如何让组合 select 在第一时间成为 "One" 条目,而不是“ ”?实现自定义渲染器时我错过了什么??我关注了这里:

Oracle tutorial of How to Use Tables - Swing - Java SE

另外,直到我点击它才显示组合。我不认为这是展示它的正确方式。我在这里尝试了另一个例子:

Show a JComboBox with custom editor and renderer, example from java2s.com

但我仍然很困惑。

How can I make the combo select the "One" entry at first moment,

这是默认行为。来自 TableModel 的数据用于 select 调用编辑器时组合框中的项目。

Using a ComboBox as an Editor 上的 Swing 教程部分包含一个演示如何执行此操作的工作示例。

the combo is not shown until I click it

这就是它的设计方式。渲染器正常显示数据。在用户开始编辑单元格之前,不会显示编辑器。

如果您想向用户表明组合框将用作编辑器,那么您需要使用自定义渲染器。您尝试的实施是不正确的,因为您永远不会将 JCombobox 作为 table 模型中的数据。

查看:How to make a JComboBox table editor have the design of an ordinary JComboBox? 可能的渲染器的几个不同实现:

  1. 我的示例展示了使用真正的组合框会是什么样子(我不喜欢它)并且
  2. 接受的答案显示了更好的渲染器。您可能希望更改示例以将面板作为带有 BorderLayout 的渲染器。然后将标签添加到 LINE_START,将图标添加到 LINE_END,这样图标就更像一个组合框,右边有向下箭头。

编辑:

but in your link, the combobox is showing the first option

不,不是。再次测试代码。单击第 2 行或第 3 行以调用编辑器以查看select编辑了哪个项目。

澄清一下我之前说的。组合框中的项目是根据 TableModel 中的数据 select 编辑的。由于您的 TableModel 是空的,因此 select.

没有项目

将一些数据放入 TableModel。 Swing 教程中的示例和 link 中的两个示例我为您提供了 TableModel 中的所有数据,这就是它们起作用的原因。

谢谢罗伯·卡米克。我不会再穿越-posting了。

我找到问题了。在默认渲染器中,我放了一行这样的代码:

class MyComboBoxRenderer extends JComboBox implements TableCellRenderer {
    public MyComboBoxRenderer(JComboBox&lt;String&gt; combo) {
        super(combo.getModel());
    }
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
        int row, int column) {
//      setSelectedItem(value);    // where lies the problem, will always be null.
        return this;
    }   
}

加载组合时,值始终为空,而我让组合select它,所以出现空行。点个赞就好了

在 CodeRanch 中,我 post 这个和系统将其视为垃圾邮件,我不知道为什么。虽然我自己找到了解决方案,但我接受你的帮助。

再次感谢。