Java 组合框未在JTable中显示其内容

Java 组合框未在JTable中显示其内容,java,swing,combobox,jtable,Java,Swing,Combobox,Jtable,我想在JTable中显示一个组合框。对于JTable,我使用一个TableModel。我已成功显示组合框(不是它的toString())。问题是我无法查看它的内容。组合框必须不可编辑。我已经读了很多教程,但我还没有找到一个与TableModel。我发现这个代码: JComboBox comboBox = new JComboBox(); comboBox.addItem("Snowboarding"); comboBox.addItem("Rowing"); combo

我想在JTable中显示一个组合框。对于JTable,我使用一个TableModel。我已成功显示组合框(不是它的toString())。问题是我无法查看它的内容。组合框必须不可编辑。我已经读了很多教程,但我还没有找到一个与TableModel。我发现这个代码:

 JComboBox comboBox = new JComboBox();
    comboBox.addItem("Snowboarding");
    comboBox.addItem("Rowing");
    comboBox.addItem("Knitting");
    comboBox.addItem("Speed reading");
    comboBox.addItem("Pool");
    comboBox.addItem("None of the above");
    sportColumn.setCellEditor(new DefaultCellEditor(comboBox));

    //Set up tool tips for the sport cells.
    DefaultTableCellRenderer renderer =
            new DefaultTableCellRenderer();
    renderer.setToolTipText("Click for combo box");
    sportColumn.setCellRenderer(renderer);
}
我不能用它有两个原因。我的组合框的内容不一样,它们不使用TableModel。这是我的密码:

公共类TpofModel扩展了DefaultTableModel,实现了TableModel{

/**
 * 
 */
private static final long serialVersionUID = 1L;
private String[] names = { "Nom", "Prénom", "Matière", "Classes" };
private Model model;

public TProfModel(Model model){
    this.model = model;
    fireTableDataChanged();
}


public Class<?> getColumnClass(int col) {
    return getValueAt(0,col).getClass();
}

public int getColumnCount() {
    return names.length;
}

public String getColumnName(int col) {
    return names[col];
}

public int getRowCount() {
    if(model != null)
        return model.getProfs().size();
    return 0;
}

public Object getValueAt(int line, int col) {

    switch (col) {
    case 0:
        return model.getProfs().get(line).getNom();
    case 1:
        return model.getProfs().get(line).getPrenom();
    case 2:
        return model.getProfs().get(line).getMatiere();
    case 3:
        return getClasses(line);
    }
    return null;
}

private JComboBox<String> getClasses(int line) {
    JComboBox<String> comboBox = new JComboBox<String>();
    for(String classe : model.getProfs().get(line).getClasses())
        comboBox.addItem(classe);
    comboBox.setSelectedIndex(0);
    return comboBox;
}


public boolean isCellEditable(int arg0, int arg1) {
    if(arg1 == 3)
        return false;
    return true;
}

public void removeTableModelListener(TableModelListener arg0) {
    // TODO Auto-generated method stub

}

@Override
public void setValueAt(Object object, int line, int col) {
    switch (col) {
    case 0:
        model.getProfs().get(line).setNom((String) object);
        break;
    case 1:
        model.getProfs().get(line).setPrenom((String) object);
        break;
    case 2:
        model.getProfs().get(line).setMatiere((String) object);
    }
    model.writeData();
}
/**
* 
*/
私有静态最终长serialVersionUID=1L;
私有字符串[]名称={“Nom”、“PréNom”、“Matière”、“Classes”};
私有模型;
公共TPROF模型(模型){
this.model=模型;
fireTableDataChanged();
}
公共类getColumnClass(int-col){
返回getValueAt(0,col).getClass();
}
public int getColumnCount(){
返回name.length;
}
公共字符串getColumnName(int-col){
返回名称[col];
}
public int getRowCount(){
如果(型号!=null)
返回model.getProfs().size();
返回0;
}
公共对象getValueAt(整数行,整数列){
开关(col){
案例0:
返回模型.getProfs().get(line.getNom();
案例1:
返回模型.getProfs().get(line.getPrenom();
案例2:
返回模型.getProfs().get(line.getMatiere();
案例3:
返回getclass(行);
}
返回null;
}
私有JComboxGetClass(int行){
JComboBox comboBox=新的JComboBox();
for(字符串类:model.getProfs().get(line.getClasses())
comboBox.addItem(类别E);
comboBox.setSelectedIndex(0);
返回组合框;
}
公共布尔值可编辑(int arg0,int arg1){
如果(arg1==3)
返回false;
返回true;
}
公共void removeTableModelListener(TableModelListener arg0){
//TODO自动生成的方法存根
}
@凌驾
public void setValueAt(对象对象、整数行、整数列){
开关(col){
案例0:
model.getProfs().get(line.setNom((String)对象);
打破
案例1:
model.getProfs().get(line.setPrenom((String)对象);
打破
案例2:
model.getProfs().get(line.setMatiere((String)对象);
}
model.writeData();
}

}模型的责任是提供数据,而不是其他。编辑和渲染器有责任中断这些数据,并最好地决定如何显示这些数据

传递给编辑器的值是
getValueAt
的结果,在下面的示例中,它只不过是一个
字符串
,但由于
JComboBox
已填充了
字符串
值,这将为编辑器提供查找该值匹配项的功能(如果存在有效的匹配项)

您需要做的就是确保编辑器/渲染器知道如何处理来自模型的数据

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.AbstractTableModel;

public class TabelEditorExample {

    public static void main(String[] args) {
        new TabelEditorExample();
    }

    public TabelEditorExample() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                ShoppingListModel model = new ShoppingListModel();
                model.addEntry(new ShoppingEntry(0, null));
                model.addEntry(new ShoppingEntry(0, null));
                JTable table = new JTable(model);

                JComboBox cb = new JComboBox(new String[]{
                    "Apples",
                    "Bananas",
                    "Pears",
                    "Ice-Cream",
                    "World Domination",
                });
                table.
                        getColumnModel().
                        getColumn(1).
                        setCellEditor(new DefaultCellEditor(cb));

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ShoppingListModel extends AbstractTableModel {

        private List<ShoppingEntry> shoppingEntries;

        public ShoppingListModel() {
            shoppingEntries = new ArrayList<ShoppingEntry>(25);
        }

        public void addEntry(ShoppingEntry entry) {
            shoppingEntries.add(entry);
            fireTableRowsInserted(shoppingEntries.size() - 1, shoppingEntries.size() - 1);
        }

        @Override
        public int getRowCount() {
            return shoppingEntries.size();
        }

        @Override
        public String getColumnName(int column) {
            return column == 0 ? "Qty" : "Item";
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return columnIndex == 0 ? Integer.class : String.class;
        }

        @Override
        public int getColumnCount() {
            return 2;
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            Object value = null;
            switch (columnIndex) {
                case 0:
                    value = shoppingEntries.get(rowIndex).getQty();
                    break;
                case 1:
                    value = shoppingEntries.get(rowIndex).getItem();
                    break;
            }
            return value;
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return true;
        }

        @Override
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
            ShoppingEntry entry = shoppingEntries.get(rowIndex);
            switch (columnIndex) {
                case 0:
                    int qty = 0;
                    if (aValue instanceof String) {
                        qty = Integer.parseInt(aValue.toString());
                    } else if (aValue instanceof Integer) {
                        qty = (Integer)aValue;
                    }
                    entry.setQty(qty);
                    break;
                case 1:
                    entry.setItem(aValue == null ? null : aValue.toString());
                    break;
            }
            fireTableCellUpdated(rowIndex, columnIndex);
        }

    }

    public class ShoppingEntry {

        private int qty;
        private String item;

        public ShoppingEntry(int qty, String item) {
            this.qty = qty;
            this.item = item;
        }

        public String getItem() {
            return item;
        }

        public int getQty() {
            return qty;
        }

        public void setItem(String item) {
            this.item = item;
        }

        public void setQty(int qty) {
            this.qty = qty;
        }

    }

}

导入java.awt.BorderLayout;
导入java.awt.EventQueue;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.DefaultCellEditor;
导入javax.swing.JComboBox;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.JTable;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
导入javax.swing.table.AbstractTableModel;
公共类选项卡EleditorExample{
公共静态void main(字符串[]args){
新选项卡eleditorexample();
}
公共选项卡eleditorexample(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
ShoppingListModel=新ShoppingListModel();
模型补遗(新购物条目(0,null));
模型补遗(新购物条目(0,null));
JTable table=新的JTable(模型);
JComboBox cb=新JComboBox(新字符串[]){
“苹果”,
“香蕉”,
“梨”,
“冰淇淋”,
“统治世界”,
});
桌子
getColumnModel()。
getColumn(1)。
setCellEditor(新的DefaultCellEditor(cb));
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
frame.add(新的JScrollPane(表));
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类ShoppingListModel扩展了AbstractTableModel{
私人购物清单;
公共ShoppingListModel(){
shoppingEntries=新ArrayList(25);
}
公共作废补遗(购物条目){
购物条目。添加(条目);
fireTableRowsInserted(shoppingEntries.size()-1,shoppingEntries.size()-1);
}
@凌驾
public int getRowCount(){
return shoppingEntries.size();
}
@凌驾
公共字符串getColumnName(int列){
返回列==0?“数量”:“项目”;
}
@凌驾
公共类getColumnClass(int columnIndex){
return columnIndex==0?Integer.class:String.class;
}
@凌驾
public int getColumnCount(){
返回2;
}
@凌驾
公共对象getValueAt(int行索引、int列索引){
对象值=空;
开关(列索引){
案例0:
价值=购物
import java.awt.*;
import java.awt.event.*;
import java.util.List;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;

public class TableComboBoxByRow extends JPanel
{
    List<TableCellEditor> editors = new ArrayList<TableCellEditor>(3);

    public TableComboBoxByRow()
    {
        setLayout( new BorderLayout() );

        // Create the editors to be used for each row

        String[] items1 = { "Red", "Blue", "Green" };
        JComboBox<String> comboBox1 = new JComboBox<String>( items1 );
        DefaultCellEditor dce1 = new DefaultCellEditor( comboBox1 );
        editors.add( dce1 );

        String[] items2 = { "Circle", "Square", "Triangle" };
        JComboBox<String> comboBox2 = new JComboBox<String>( items2 );
        DefaultCellEditor dce2 = new DefaultCellEditor( comboBox2 );
        editors.add( dce2 );

        String[] items3 = { "Apple", "Orange", "Banana" };
        JComboBox<String> comboBox3 = new JComboBox<String>( items3 );
        DefaultCellEditor dce3 = new DefaultCellEditor( comboBox3 );
        editors.add( dce3 );

        //  Create the table with default data

        Object[][] data =
        {
            {"Color", "Red"},
            {"Shape", "Square"},
            {"Fruit", "Banana"},
            {"Plain", "Text"}
        };
        String[] columnNames = {"Type","Value"};
        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        JTable table = new JTable(model)
        {
            //  Determine editor to be used by row
            public TableCellEditor getCellEditor(int row, int column)
            {
                int modelColumn = convertColumnIndexToModel( column );

                if (modelColumn == 1 && row < 3)
                    return editors.get(row);
                else
                    return super.getCellEditor(row, column);
            }
        };

        JScrollPane scrollPane = new JScrollPane( table );
        add( scrollPane );

    }
    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("Table Combo Box by Row");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new TableComboBoxByRow() );
        frame.setSize(200, 200);
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

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