我正在制作一组自定义swing组件,它们实现了required
标志或tabIndex
等各种属性。我在尝试填充各种自定义组件的List
时遇到问题,然后根据每个组件的tabIndex
对列表进行排序。
我是如何尝试这样做的,方法是让我的组件实现一个名为Indexed
的接口,该接口实现单个方法getIndex()
。然后使用我的IndexedComparator
进行排序。
我的课程:
索引:
public interface Indexed {
public int getIndex();
}
IndexedComparator:
public class IndexedComparator implements Comparator<Indexed> {
@Override
public int compare(Indexed o1, Indexed o2) {
return o1.getIndex() - o2.getIndex();
}
}
WWTextField:
public class WWTextField extends JTextField implements Indexed, FocusListener {
private boolean required;
private int tabIndex;
...
@Override
public int getIndex() {
return tabIndex;
}
}
NewJFrame:
public class NewJFrame extends JFrame {
List<? extends Component & Indexed> list = new ArrayList<>();
IndexedFocusTraversalPolicy policy = new IndexedFocusTraversalPolicy();
public NewJFrame() {
initComponents();
list.add(wWTextField1);
list.add(wWTextField2);
list.add(wWTextField3);
list.add(wWTextField4);
list.add(wWTextField5);
list.add(wWFormatedTextField1);
list.add(wWFormatedTextField2);
Collections.sort(list);
policy.populateComponents(list);
this.setFocusTraversalPolicy(policy);
}
}
编辑:我忘记发帖了解实际问题。为什么不执行我的
List<? extends Component & Indexed> list = new ArrayList<>();
工作?当我尝试编译时,我得到了这些错误:
NewJFrame.java:22: error: > expected
NewJFrame.java:22: error: ';' expected
NewJFrame.java:22: error: illegal start of type
答案 0 :(得分:0)
Comparator
个实例不是“自动”的,您必须指定它们。我想你的意思是:
Collections.sort(list, new IndexedComparator());
答案 1 :(得分:0)
仅在声明类型参数的情况下允许约束(即class C< T extends I & J > {}
,interface E< T extends I & J > {}
,< T extends I & J > void f() {}
)。
因此,您将减少为交叉类型名称。这个非特性是让我误解Java的许多事情之一。
我认为NewJFrame
中的T extends Component & Indexed
可能是通用的,而list
可能是List< T >
类型。在某些情况下,类型推断可以让客户端代码避免指定特定类型。