我们有什么办法可以用编程方式发射ComponentListener吗?例如,请看下面的代码快照。
private class DisplayAllRevenue extends ComponentAdapter
{
@Override
public void componentShown(ComponentEvent e)
{
}
}
allRevenueJScrollPane.addComponentListener(new DisplayAllRevenue());我创建了一个ComponentListener并将它附加到一个JScrollPane中。现在,我也需要使用我自己的代码手动启动它。我该怎么做呢?一旦发生JComboBox事件,我需要启动这段代码。这意味着,用户选择年份或其他什么,然后这个代码被触发.基于此,我需要启动大量的ComponentListeners。这些都是大量的数据库调用,它们会将数据输入不同的屏幕,因此,我不会使用ItemStateChanged内部的全部代码。
发布于 2014-11-17 07:04:52
你说:
我创建了一个ComponentListener并将它附加到一个JScrollPane中。现在,我也需要使用我自己的代码手动启动它。我该怎么做呢?一旦发生JComboBox事件,我需要启动这段代码。这意味着,用户选择年份或其他什么,然后这个代码被触发.
响应JComboBox选择事件的标准方法是使用ItemListener或ActionListener。
基于此,我需要启动大量的ComponentListeners。这些都是大量的数据库调用,它们会将数据输入不同的屏幕,因此,我不会使用ItemStateChanged内部的全部代码。
在上面的声明中,我没有看到任何东西会建议我创建一个假象,比如试图人为地发射一个ComponentListener。如果您有更强的理由,您将不得不告诉我们,否则,规范的答案不是这样做,而是使用标准侦听器,正如我前面提到的。
假设您的程序的结构大致近似于MVC设计,请注意,您的组合框选择可以触发您的Control类来更改模型,并且模型的更改可能很重要,或者对您的视图中的多个组件、它们本身正在侦听模型的状态产生重大影响,我认为这正是您想要做的。
编辑
你说:
我试着手动启动它的原因是这样的。我有JTabbedPane。有5个标签。在每个选项卡中,都有一个表,它从数据库中获取数据。用于将数据输入表的SQL查询非常重,有些甚至将5-6个表连接在一起。这就是为什么我不能一次触发所有5个SQL查询(针对所有5个表),bcs (我担心它会失败)。如果我有一个组件侦听器,他们将只调用适合当前显示表的SQL代码。SQL代码接受参数。几年了。这就是为什么组合框在那里。
当然,这是您的程序,您可以任意构造它,但是如果它是我的,我将主要针对MVC结构,这样我就可以更容易地独立地调试组成部分,并能够进行模拟之类的操作。当然,您可以在Comopnent上调用getComponentListeners(),然后通过创建自己的ComopnentEvent,然后调用每个侦听器的componentXXX(ComponentEvent cEvt)方法来触发它们,但我担心这会导致很难找到bug,并且很难测试和升级您的程序。您决定使用哪种组件通知方法?当JVM适当地触发相同的方法时,程序应该做什么?
我想知道你是否把模型和视图混合在一起。我想知道是否更好的办法是抽象出模型--支撑你整个程序和工作的业务逻辑。应该通知模型,从而知道当前正在显示表,同样,控件也会通知它年份更改的时间。然后,模型可以从数据库中请求更新,当然是后台线程,我相信是由Control完成的。然后,这些数据将被发送回模型。视图将通知模型中的侦听器其更改,然后它将更改当前显示的表的显示。
如果您绝对必须使用基于GUI的侦听器,那么使用PropertyChangeListener,因为每个GUI组件都有对该侦听器的天生支持,通过创建自己的绑定属性,您将创建一个不应该与其他GUI行为或状态发生冲突的侦听器。
https://stackoverflow.com/questions/26967020
复制相似问题