首页 > 解决方案 > 为表格列中的每一行设置不同的组合框作为单元格内容

问题描述

我正在JTable用 Java 创建一个,并且我正在迭代一个名为 的列表methodtraces2,对于第 10、11、12 和 13 列,我希望每个单元格都由一个JComboBox. 例如,第 10 列中的每个单元格都应该包含一个组合框,并且组合框中的每一行都应该包含列表中的一个条目,第methodtrace.getCallersList()10 列中的每个单元格将根据 的内容而有所methodtrace.getCallersList()不同,这对于 的每次迭代都是不同的methodtraces2

我获取每个组合框的所有值并将它们存储在 的数组中String items1,该数组表示表中每一行的组合框的内容(的每次迭代methodtraces2)。

我需要对第 11、12 和 13 列做同样的事情。

该方法getCellEditor负责将组合框分配给适当的列,现在,我为第 10 列中的所有行输入了相同的组合框内容。

 public class TableComboBoxByRow extends JFrame
{
List<TableCellEditor> editors = new ArrayList<TableCellEditor>(4);
static List<MethodTrace2> methodtraces2= new ArrayList<MethodTrace2>(); 


public TableComboBoxByRow() throws SQLException
{
    DatabaseReading2 db = new DatabaseReading2(); 
    DatabaseReading2.MakePredictions();
    methodtraces2= db.getMethodtraces2(); 
    int j=0; 
    String[] items1 = new String [methodtraces2.size()]; 
    String[] items2 = new String [methodtraces2.size()]; 
    String[] items3 = new String [methodtraces2.size()]; 
    String[] items4 = new String [methodtraces2.size()]; 
 Object[][] data = new Object[methodtraces2.size()][10000]; 
    // Create the editors to be used for each row
    for(MethodTrace2 methodtrace: methodtraces2) {
        data[j][0]= methodtrace.MethodRepresentation.getMethodid(); 
        data[j][1]= methodtrace.MethodRepresentation.getMethodname(); 
        data[j][2]= methodtrace.Requirement.getID(); 
        data[j][3]= methodtrace.Requirement.getRequirementName(); 
        data[j][4]= methodtrace.ClassRepresentation.classid; 
        data[j][5]= methodtrace.ClassRepresentation.classname; 
        data[j][6]= methodtrace.gold; 
        data[j][7]= methodtrace.subject; 
        data[j][8]= methodtrace.goldpredictionCaller; 
        data[j][9]= methodtrace.goldpredictionCallee; 

        int i=0; 
        items1 = new String[methodtrace.getCallersList().size()]; 
         for(Method2Representation caller: methodtrace.getCallersList()) {
              items1[i]=caller.toString(); 
              System.out.println(caller.toString());
              i++; 

          }
        // data[j][10]=items1; 
         int k=0; 
         items2 = new String[ methodtrace.getCalleesList().size()]; 
         for(Method2Representation caller: methodtrace.getCalleesList()) {
              items2[k]=caller.toString(); 
              System.out.println(caller.toString());
              k++; 

          }
         int r=0; 
         items3 = new String[methodtrace.getCallersListExecuted().size()]; 
         for(Method2Representation caller: methodtrace.getCallersListExecuted()) {
              items3[r]=caller.toString(); 
              System.out.println(caller.toString());
              r++; 

          }
         int z=0; 
         items4 = new String[10000]; 
         for(Method2Representation caller: methodtrace.getCalleesListExecuted()) {
              items4[z]=caller.toString(); 
              System.out.println(caller.toString());
              z++; 

          }




            JComboBox comboBox1 = new JComboBox( items1 );
            DefaultCellEditor dce1 = new DefaultCellEditor( comboBox1 );
            editors.add( dce1 );

            JComboBox comboBox2 = new JComboBox( items2 );
            DefaultCellEditor dce2 = new DefaultCellEditor( comboBox2 );
            editors.add( dce2 );


            JComboBox comboBox3 = new JComboBox( items3 );
            DefaultCellEditor dce3 = new DefaultCellEditor( comboBox3 );
            editors.add( dce3 );


            JComboBox comboBox4 = new JComboBox( items4);
            DefaultCellEditor dce4 = new DefaultCellEditor( comboBox4 );
            editors.add( dce4 );



         j++; 
    }






    String[] columnNames = {"MethodID","MethodName", "RequirementID", "RequirementName", "ClassID", "ClassName", "Gold", "Subject", "GoldPredictionCaller", "GoldPredictionCallee", 
            "Callers", "CallersExecuted", "Callees", "CalleesExecuted"};
    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 == 10 && row < methodtraces2.size())
                return editors.get(0);

            else
                return super.getCellEditor(row, column);
        }
    };
    table.getColumnModel().getColumn(10).setWidth(10000);
    table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
    JScrollPane scrollPane = new JScrollPane( table );
    getContentPane().add( scrollPane );
}



class ComboBoxRenderer extends JComboBox implements TableCellRenderer
{

    public ComboBoxRenderer()
    {
        setBorder(new EmptyBorder(0, 0, 0, 0));
    }

    public Component getTableCellRendererComponent(
        JTable table, Object value, boolean isSelected,
        boolean hasFocus, int row, int column)
    {
        removeAllItems();
        addItem( value );
        return this;
    }
}


public static void main(String[] args) throws SQLException
{

    TableComboBoxByRow frame = new TableComboBoxByRow();
    frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
    frame.pack();
    frame.setVisible(true);
}
}

标签: javaswingjtablecelljcombobox

解决方案


我不确定我是否完全理解这里发生了什么,但您提到您正在迭代一个名为methodtraces2的列表,但是在您发布的代码中:

 for(Method2Representation caller: methodtrace (NOT methodtrace2!).getCallersList()) {
    items1[i]=caller.toString(); 
    System.out.println(caller.toString());
    i++; 

  }

您实际上是在迭代 methodTrace(注意:不是 methodTraces2)。调试此类问题时要尝试的另一件事是简化如下:

 for(Method2Representation caller: methodtrace.getCallersList()) {
    items1[i]=caller.toString(); 
    System.out.println(caller.toString());
    i++; 

  }

可以更改为:

 String stuff[] = {"1", "2", "3", .... "N"};
 for(String s : stuff) {
    items1[i]=s
    System.out.println("testing items1[" + i + "]: " + items[i]);
    i++; 
  }

最后一点,我希望您更改变量名称以保护某些专有代码,因为这些变量名称最终会使任何人发疯!使用描述性变量名称,而不是 items1,使用调用者或 items2 使用被调用者。

呵呵:)


推荐阅读