gpt4 book ai didi

java - 如何避免嵌套的 ActionListeners?

转载 作者:搜寻专家 更新时间:2023-10-31 08:25:40 24 4
gpt4 key购买 nike

在我的程序中,我希望用户:

  1. 自行选择/打开数据库(如 Access)
  2. 从数据库中选择一个表
  3. 从表中选择列

在我的代码中,我有一个类执行如下操作:

mntmOpenDatabase.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//open the database
//display tables as buttons
tableButton.addActionListener(new ActionListener() { // select a table
public void actionPerformed(ActionEvent e) {
//display the columns of the table selected as buttons
colButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {// add to the list of columns to be exported }

这导致了一个非常大的代码块。是否有更清洁、更简单的方法来执行此操作?

最佳答案

解决方案是重构:

  • 为打开数据库的代码创建一个单独且可单独测试的类。
  • 以及用于显示此数据的单独且可单独测试的类。
  • 在 ActionListener 中,创建这些类的实例,或者与它们交互(如果它们已经存在)。
  • 学习 M-V-C(模型- View -控制)设计模式的基本原理,并加以运用。你不必对他们束手无策,上帝知道有很多变体,但至少应该尊重他们的总体指导原则。
  • 努力使您的 GUI 或 View 尽可能地愚蠢。它知道如何显示其数据,它具有允许控件更新其显示的工具,并且它知道在用户与其交互时如何通知控件,仅此而已。
  • 附带建议 1:确保所有数据库交互都在后台线程中完成。
  • 附带建议 2:确保几乎所有 Swing 交互都在 Swing EDT(事件分发线程)中完成。

请看这个类似但更完整的问题和答案:How can one best avoid writing bloated GUI code? .答案已经尽善尽美,我希望我能对它们投无数次赞成票。

例如,您上面的代码可以像这样简单:

mntmOpenDatabase.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
control.openDatabase();
}
}

关于java - 如何避免嵌套的 ActionListeners?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33445006/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com