2

我已经开始尝试创建普通的 MVC Swing 组件。我对 M 和 C 没有任何问题,但是 V 向我抛出了一个我通常无法解决的问题。问题是:Controller是组件的主类(例如MyComponent),它扩展了JComponent。View 是从 ComponentUI 类扩展的 ui 委托 (MyCompanentUI)。委托所做的只是在 MyCompanent 中添加 JTextField 并在 MyComponentModel 和该字段之间提供数据绑定。它工作得很好。但是如何将事件从 JTextField 绑定到 MyComponent?如果用户想要处理一些事件,他会向 MyComponent 添加侦听器,但所有真实事件(鼠标、焦点、键等)都会被 JTextField 拦截,而用户并不真正知道。那么有什么正常的方法可以做到这一点,除了捕获事件并手动将其转换为原始组件?还是有另一种方法来创建委托,而我真的做错了?

升级版:

谢谢你的回复,垃圾神。但我心里有一些不同的东西。我说的是“事件继承”之类的东西,例如“inheritsPopupMenu”方法。这样组件发生的按键、焦点或鼠标事件本身就不会处理它,而是直接将其传递给父组件。但这似乎是不可能的,因为我注意到 JSpinner 有完全相同的问题——你几乎无法从这个组件获得任何事件通知。

4

1 回答 1

2

如果您正在编写自己的JComponent子类并希望允许自定义 UI 委托,我将从 Kirill Grouchnikov 的How to Write a Custom Swing Component开始。

如果您正在编写包含现有JComponent子类的组合,例如JTextField,请查看您是否可以利用如何使用键绑定Action中描述的现有实例。是一个例子。您可以从组件的源代码或使用文章Key Bindings中看到的@camickr 的方便实用程序了解此类操作的名称。ScrollAction

于 2012-07-12T17:49:59.710 回答