簡體   English   中英

自定義表模型中的JComboBox

[英]JComboBox in Custom table model

我對在自定義表模型中的Column中添加JComboBox提出了疑問,該模型擴展了ObjectTableModel(表為OmniJTable )。 我工作了2天,無法解決此問題。

我解決的一件事是在Column中顯示JComboBox ,但是現在我從中選擇任何內容都遇到了問題(似乎它不可編輯,並且諸如“ setEditable()”之類的東西都無法正常工作)。

這是我使用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:對不起,我的英語不是我的主要語言。

最簡單的事情是不添加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;
     }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM