【问题标题】:JComboBox inside a JTable cellJTable 单元格内的 JComboBox
【发布时间】:2012-11-04 13:00:57
【问题描述】:

我无法将 javax.swing.JComboBox 放入 org.jdesktop.swingx.JXTable 单元格。我浏览了之前关于这个问题的问题,但没有帮助。

我试过了:

colModel.getColumnExt(HDTableAdapter.STATUS).setCellEditor(editorCB);  
colModel.getColumnExt(HDTableAdapter.STATUS).setCellRenderer(rendererCB);

class comboBoxRenderer extends JComboBox implements TableCellRenderer {

    public comboBoxRenderer(String[] items) {
        super(items);
    }

    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        if (isSelected) {
            setForeground(table.getSelectionForeground());
            super.setBackground(table.getSelectionBackground());
        } else {
            setForeground(table.getForeground());
            setBackground(table.getBackground());
        }

        setSelectedItem(value);
        return this;
    }
}

class comboBoxEditor extends DefaultCellEditor {
    public comboBoxEditor(String[] items) {
        super(new JComboBox(items));
    }
}

但在这种情况下,我在单元格内得到了一个不可编辑的 ComboBox。

【问题讨论】:

  • 请学习java命名约定并坚持下去
  • 你为什么感到惊讶? JComboBox 默认情况下不可可编辑...
  • 一个评论追逐另一个 刚刚注意到 JXTable 位:dont 实现一个渲染器(曾经在 SwingX 中!),而不是子类 ComponentProvider 用于不受支持的组件类型(有测试部分xxVisualCheck中的示例,xx == Renderer或== JXTable(可能,不记得确切)
  • 不可编辑,我的意思是当我点击它时,列表没有显示,所以我无法更改值。
  • 你明白“约定”这个词吧?然后学习特定于 java 的那些 ;-)

标签: java swing jtable jcombobox


【解决方案1】:

您的 ComboxEditor 看起来有问题.. 改用这个:

class ComboBoxEditor extends DefaultCellEditor {

    public ComboBoxEditor(String[] items) {
    super(new JComboBox(items));
    JCombobxToolTipRenderer renderer = new JCombobxToolTipRenderer();
    ((JComboBox)editorComponent).setRenderer(renderer);
}

public ComboBoxEditor(ComboBoxModel aModel) {
    super(new JComboBox(aModel));
    JCombobxToolTipRenderer renderer = new JCombobxToolTipRenderer();
    ((JComboBox)editorComponent).setRenderer(renderer);
}
}

class JCombobxToolTipRenderer extends DefaultListCellRenderer {

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

    JComponent comp = (JComponent) super.getListCellRendererComponent(list,
            value, index, isSelected, cellHasFocus);

    if (-1 < index && null != value) {
        list.setToolTipText((String) value);
    }
    return comp;
}
}

【讨论】:

  • 我不确定 JComboxToolTipRenderer / JComboBoxToolTipRenderer 应该是什么......?
  • 随机代码 sn-p (不要在这方面模仿 @mKorbel :-) OP 的编辑器很好,应该按原样工作 - 毕竟,它只是一个方便的子类,正好与它的超级功能相同。
  • 哎呀..对不起..没有花时间看我很久以前写的课程。我使用这些类,一切对我来说都很好。你有没有对 TableColumnModel 进行子类化?你能发布那个代码吗?
  • 刚刚意识到您使用的是 SwingX 的 TableColumnModelExt 类,如果您尝试这样做,它可能会起作用:TableColumnModel columnModel=getColumnModel();组合框渲染器渲染器=新组合框渲染器(数据);组合框编辑器编辑器=新组合框编辑器(数据); columnModel.getColumn(column).setCellRenderer(renderer); columnModel.getColumn(column).setCellEditor(editor);
  • SwingX 与 OP 感知到的问题无关(打赌它与核心完全相同)......对于所有其他人来说仍然无法重现,因为他/她没有显示 sscce。顺便说一句,您可以编辑您的答案 - cmets 中的代码很难阅读
【解决方案2】:

试试这个,

class FinCellEditor extends AbstractCellEditor implements TableCellEditor{

    Component component;

    private JTextField text;
    private JComboBox combo;
    private int rowIndex;

       public FinCellEditor(){
                text = new JTextField();
              combo =new JComboBox();
       }

    @Override
        public Object getCellEditorValue() {
               Object select = null;
               if(rowIndex==9||rowIndex==10){
               select = combo.getSelectedItem(); 
               return select;
               }else{    
               if(select!=null){
                  text.selectAll();
               } 
               select = text.getText();
               return select;
               }
        }
    @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
              if (row == 7) {      
                  date.setEnabled(true);
                  rowIndex=row;
                  return date;
              }else if (row == 9) {
                 combo.removeAllItems();
                 combo.addItem("Male");
                 combo.addItem("Female");
                 rowIndex=row;
                 return combo;
            }else if (row == 10) {
                 combo.removeAllItems();
                 combo.addItem("Married");
                 combo.addItem("UnMarried");
                 rowIndex=row;
                 return combo;

           } else {
                text.setEnabled(true);
                rowIndex=row;
                return text;
           }
       }

【讨论】:

    猜你喜欢
    • 2020-01-02
    • 2015-03-07
    • 2011-03-16
    • 1970-01-01
    • 2012-03-05
    • 2021-06-20
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多