我正在尝试使用 MVC 架构模式构建一个简单的 Java Swing 应用程序。我所做的是在我的视图中创建用户界面组件(作为私有),并具有返回组件的公共方法。然后这些方法被控制器调用,通过它我可以为事件/动作监听器编写方法。下面是一个示例:
看法:
private JButton btnAdd;
public JButton getBtnAdd(){
return btnAdd;
}
控制:
myGuiFrame gui = new myGuiFrame();
//on add button clicked
gui.getBtnAdd().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//calls to model
}
});
这个实现正确吗?
如果是这样,那么我对 FocusListeners 有问题。当我在视图中创建 FocusListener 时,会在视图中创建 focusLost 和 focusGained 方法。
private FocusListener l;
someComponent.addFocusListener(l);
l = new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
}
@Override
public void focusGained(FocusEvent e) {
// TODO Auto-generated method stub
}
};
我希望所有事件处理程序都在我的控制器中。我的问题是......有没有一种方法可以从我的控制器调用/声明 focusLost 和 focusGained 方法?我试图将 FocusListener 定义为 public,以便我可以在我的控制器中定义它:
看法:
public FocusListener l;
public someComponentType someComponent;
控制器:
gui.l = new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
}
@Override
public void focusGained(FocusEvent e) {
// TODO Auto-generated method stub
gui.someComponent.addFocusListener(gui.l);
}
};
然而,这不起作用。
是否可以从控制器处理 FocusEvents?
编辑:
天哪,我的坏。不太明白罗宾的意思。我太专注于在某处明确定义 FocusListener。一个简单的:
gui.getTextFieldEmployeeCode().addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
}
@Override
public void focusGained(FocusEvent e) {
// TODO Auto-generated method stub
System.out.println("YES!!!");
}
});
在控制器中可以按照我计划的方式正常工作,尽管我非常喜欢 nIcE cOw 的处理方式。只是出于好奇,是否有在 Swing 应用程序上实现 MVC 的标准或广泛接受的方式?