我正在创建一个GUI,该GUI根据选定的图像特征显示按钮。假设图像A具有特征1、2和3,因此将为特征1、2和3实现过滤器的选定按钮添加到面板中。
我希望过滤器是可以轻松添加到代码中的方法,所以我使用反射来处理特征,以便为每个图像获取Corret方法。
将按钮添加到GUI时,它需要一个动作侦听器,并在动作侦听器中调用其方法。
如果有用于过滤方法的参数,则也将一组文本字段添加到GUI,以便可以收集参数。
如果该方法没有参数,则调用可以正常工作,添加文本字段以及通过这些TF捕获参数也可以。
问题是:使用未知大小的列表是否可以将此列表用作反射调用的参数?
图像1显示了没有选择图像的GUI,选择图像后,添加了按钮,GUI看起来像2。
public class Filters(){
@Name("Decompose")
public void decompose() {
...decompose the image
}
@Name("Weighted Blur")
public void blurImage(@ParamName("Weight") int weight, @ParamName("Radius") int radius) {
...blur the image
}
}
public class Control(){
public void addFilterFunctions(ArrayList<Method> applicableMethods) {
for(Method m : applicableMethods) {
addButton(m);
}
}
}
public void addButton(Method m) {
JButton newButton = new JButton(m.getAnnotation(Name.class).value());
newButton.addActionListener(genericListener(m, newButton, methodFields));
}
private ActionListener genericListener(Method m, JButton b, ArrayList<JTextField> methodFields) {
return listener ->{
try {
int[] params = new int[methodFields.size()];
for(int i =0; i<methodFields.size();i++) {
params[i] = Integer.parseInt(methodFields.get(i).getText());
}
m.invoke(filters, params);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}
如您所见,我正在从添加到JPanel的textField中收集参数,并从中创建一个int []。
但是似乎invoke方法将Object ... objs作为参数,据我的理解是一个列表,但是我收到“ java.lang.IllegalArgumentException:错误的参数数量”错误。
an Object...
实际上与相同Object[]
,因此您需要传递an Object[]
才能成功:
Object[] params = new Object[methodFields.size()];
for (int i = 0; i < methodFields.size(); i++) {
params[i] = Integer.parseInt(methodFields.get(i).getText());
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句