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

时间:2016-08-24 10:08:32

标签: java swing jtable jcombobox renderer

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使组合选择所有其他值的空选项,没有人告诉它这样做。空的条目来自无处。

如何让组合在第一时间选择“一个”条目,而不是“”?实现自定义渲染器时我错过了什么?我跟在这里:

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

此外,直到我点击它才会显示组合。我不认为这是展示它的正确方法。我试着在这里跟随另一个例子:

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

但我仍然感到困惑。

2 个答案:

答案 0 :(得分:1)

  

如何让组合选择&#34; One&#34;第一时间进入,

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

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

  

直到我点击它才会显示组合

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

如果要向用户显示组合框将用作编辑器的指示,则需要使用自定义渲染器。您尝试的实现不正确,因为您永远不会将JCombobox作为表模型中的数据。

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

  1. 我的例子显示了使用真正的组合框会是什么样的(我不喜欢它)和
  2. 接受的答案显示了更好的渲染器。您可能希望更改示例以将面板作为具有BorderLayout的渲染器。然后,您将标签添加到LINE_START,将图标添加到LINE_END,使图标更加类似于带右箭头的组合框。
  3. 编辑:

      

    但在您的链接中,组合框显示第一个选项

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

    澄清我之前说过的话。根据TableModel中的数据选择组合框中的项目。由于您的TableModel为空,因此无法选择项目。

    在TableModel中放入一些数据。 Swing教程中的示例和我提供的链接中的两个示例都包含TableModel中的数据,这就是它们工作的原因。

答案 1 :(得分:0)

谢谢Rob Carmick。我不会再发帖了。

我发现了这个问题。在默认渲染器中,我放了一行代码:

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;
    }   
}

当加载组合时,该值始终为null,我让组合选择它,因此出现空行。评论它,一切都很好。

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

再次感谢。