自定义表模型中的JComboBox

时间:2015-08-18 09:06:01

标签: java swing jtable jcombobox

我有问题是将JComboBox添加到自定义表模型中的列,该模型扩展了ObjectTableModel(表格为OmniJTable)。我工作2天,无法解决这个问题。

我解决的一件事是在列中显示JComboBox,但是现在我从选择任何内容时遇到了问题(似乎它不可编辑,以及类似于#34; setEditable()& #34;没有工作)。

以下是我使用ObjectTableModel向jComboBox添加OmniJTable的代码。

class CheckBoxCellRenderer extends JComboBox implements TableCellRenderer {
    JComboBox combo;
    public CheckBoxCellRenderer(JComboBox comboBox) {
        this.combo = new JComboBox();
        for (int i=0; i<comboBox.getItemCount(); i++){
            combo.addItem(comboBox.getItemAt(i));
        }
    }
    @Override
    public Component getTableCellRendererComponent(JTable jtable, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        combo.setSelectedItem(value);
        return combo;
    }
} 
private void addComboBoxToStatusColumn(JTable table)
{
    final int statusColumnIndex = bazaTelefonowOmniJTable.getColumnModel().getColumnIndex("Status");

    TableColumn tmpColum = bazaTelefonowOmniJTable.getColumnModel().getColumn(statusColumnIndex);
    final JComboBox comboBox = new JComboBox();
    comboBox.setEditable(true);
    comboBox.setEnabled(true);
    loadRecordStatusFromDictionary(comboBox);


    DefaultCellEditor defaultCellEditor=new DefaultCellEditor(comboBox);
    tmpColum.setCellEditor(defaultCellEditor);
    tmpColum.setCellRenderer(new CheckBoxCellRenderer(comboBox));
    bazaTelefonowOmniJTable.setEditable(true);
    //table.repaint();
} 

正如我所说,这个将jComboBox添加到Column,但我不知道如何让这个允许我在jComboBox中选择项目。

PS:Sry我的英语,它不是我的主要语言。

1 个答案:

答案 0 :(得分:1)

最简单的事情是不添加CellRenderer。在这种情况下,表将其呈现为标签,单击时会显示组合框。这是一个例子:

package snippet;

import java.awt.Component;

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

public class JTableTest extends JFrame {

    public JTableTest() {
        super(JTableTest.class.getName());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        initComponents();
    }

    private void initComponents() {
        JTable table = new JTable(new Object[][] { { "1", "One" }, { "2", "Two" } }, new Object[] { "Column One", "Status" });
        addComboBoxToStatusColumn(table);
        add(new JScrollPane(table));
        pack();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override public void run() {
                new JTableTest().setVisible(true);
            }
        });
    }

    private void addComboBoxToStatusColumn(JTable table) {
        final int statusColumnIndex = table.getColumnModel().getColumnIndex("Status");

        TableColumn tmpColum = table.getColumnModel().getColumn(statusColumnIndex);
        final JComboBox comboBox = new JComboBox();
        loadRecordStatusFromDictionary(comboBox);

        DefaultCellEditor defaultCellEditor = new DefaultCellEditor(comboBox);
        tmpColum.setCellEditor(defaultCellEditor);
    }

    private void loadRecordStatusFromDictionary(JComboBox comboBox) {
        comboBox.addItem("Two");
        comboBox.addItem("Four");
        comboBox.addItem("Six");
    }
}

您还需要覆盖模型中的isCellEditable方法。

 model = DaneTableModel(some arg) {
     public boolean isCellEditable(int row, int col) {
        if(col == STATUS_COLUMN) return true ;
        return false;
     }
 }