Установите другое поле со списком в качестве содержимого ячейки для каждой строки в столбце таблицы - PullRequest
0 голосов
/ 10 июня 2018

Я создаю JTable в Java и перебираю список с именем methodtraces2, для столбцов 10, 11, 12 и 13 я бы хотел, чтобы каждая ячейка была сделана из JComboBox.Например, каждая ячейка в столбце 10 должна содержать поле со списком, а каждая строка в поле со списком должна содержать одну запись в списке methodtrace.getCallersList(), каждая ячейка в столбце 10 будет отличаться в зависимости от содержимого methodtrace.getCallersList(), котороеотличается для каждой итерации methodtraces2.

Я беру все значения для каждого поля со списком и сохраняю их в массиве String items1, который представляет содержимое поля со списком для каждой строки таблицы (каждая итерация methodtraces2).

  • items1 должен заполнять comboBox1 на каждой итерации methodtraces2
  • items2 должен заполняться comboBox2
  • items3 должен заполняться comboBox3
  • items4 должно заполниться comboBox4

Мне нужно сделать то же самое для столбцов 11, 12 и 13.

  • items2 содержит значения поля со списком для столбца 11
  • items3 содержит значения поля со списком для столбца 12
  • items4 содержит значения поля со списком для каждой строкив столбце 14.

Метод 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);
}
}

1 Ответ

0 голосов
/ 10 июня 2018

Я не уверен, что полностью понимаю, что здесь происходит, но вы упомянули, что перебираете список с именем 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, используйте вызываемые абоненты.

HH:)

...