java - 为表格列中的每一行设置不同的组合框作为单元格内容
问题描述
我正在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);
}
}
解决方案
我不确定我是否完全理解这里发生了什么,但您提到您正在迭代一个名为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 使用被调用者。
呵呵:)