我有一个只接受String的方法。
public void setVerticalAlignment(String align) {
...
gd.verticalAlignment = align; // accepts only int.
...
}
但是gd.verticalAlignment
只接受一个int。通常这是由类似gd.verticalAlignment = SWT.TOP
的东西设置的,其中SWT.TOP是静态的int.
有可能用类似setVerticalAlignment("SWT.TOP")
的东西来调用这个方法吗?
如果使用Java 7,则可以始终在Strings:上使用switch
switch (align) {
case "SWT.TOP":
gd.verticalAlignment = SWT.TOP;
/* etc */
}
老实说,我会避免使用像"STW.TOP"
这样的字符串。如果我真的必须以除int
之外的其他方式存储对齐状态,我会使用枚举,它可能在旧版本的Java中的switch
中使用。
听起来你想要一张地图:
// Ideally use ImmutableMap from Guava
private static final Map<String, Integer> ALIGNMENTS = mapAlignments();
private static final Map<String, Integer> mapAlignments() {
Map<String, Integer> ret = new HashMap<String, Integer>();
ret.put ("SWT.TOP", SWT.TOP);
// etc
return ret;
}
然后您可以稍后从地图中提取(并打开盒子)。
或者,最好首先更改方法声明以避免这种情况:)
Integer.parseInt(String)
如果字符串未指定为整数值,则可以引发NumberFormatException。同样在java的早期版本中,您不能在Strings上应用开关大小写。因此,您可以更好地使用以下内容:
if(("SWT.TOP").equals(align))
{
gd.verticalAlignment = SWT.TOP;
}
为什么要使用文本字段?对齐只有几个合法的选择,所以你应该真正使用像JComboBox这样的东西。您可以将自定义对象存储在JComboBox中,这样它们既可以显示命名常量,也可以存储整数常量:
public class SwingAlignOption {
public final String name;
public final int value;
public SwingAlignOption(String name, int value) {
this.name = name;
this.value = value;
}
public String toString() { return name; }
}
然后,您可以像comboBox.addItem(new SwingAlignOption("TOP", SWT.TOP))
一样将实例添加到组合框中。
请注意,JComboBox在Java 6和7之间发生了变化。在Java 7库中,JComboBox是通用的,这使得在内部存储这样的自定义对象并在以后检索它们的值变得更容易。在Java6中,访问所选值时必须使用强制转换。