【问题标题】:How to avoid redundant coding with JCheckBoxes in Java如何避免在 Java 中使用 JCheckBoxes 进行冗余编码
【发布时间】:2011-08-26 15:25:03
【问题描述】:

我有一组实现特定接口的类和一组复选框。如果没有选中任何复选框,我想抛出一个错误。如果至少选择了一个或多个复选框,那么它应该创建与该复选框关联的对象。

我就是这样做的。

interface U { ... }

class A implements U { ... }
class B implements U { ... }
class C implements U { ... }

class Main {
    //.... 
    //....
    public void findSelectedCheckBoxesAndCreateObjects() {
        if(!(checkboxA.isSelected() || checkboxB.isSelected() || checkboxC.isSelected()) {
            System.out.println("No checkboxes selected");
            return;
        }

        //if any selected, create associated object
        if(checkboxA.isSelected()) new A(file);
        if(checkboxB.isSelected()) new B(file);
        if(checkboxC.isSelected()) new C(file);
    }
}

现在我有 3 个问题。

  1. 这只是一个示例代码。 Original 有 8 个复选框和类,未来还会有更多。
  2. 我不能每次有新课程检查时都添加|| checkboxD.isSelected()
  3. 同样的事情。我不能一直为每个班级添加if(checkboxD.isSelected()) new D(file);

这很不雅。我可以有某种循环来删除冗余代码吗?

请给我你的建议。 谢谢。

【问题讨论】:

  • 问题,1) 是否有可能只选择一个 JCheckBox,或者两个、三个...不止一次,2) public void findSelectedCheckBoxesAndCreateObjects() { 将从 JCheckBox#ItemListener 或 ActionListenere 中调用,或者有/例如来自 JButton 的 Action ???任何事件/动作
  • 答案:1. 不可以。可以选择多个复选框。 2. 这是 JButton 的一个示例动作。 :)
  • 对于证明代码,如果您在所有情况下都等待/期望正确的输出download.oracle.com/javase/tutorial/uiswing/components/… 和最好的 DB tips4java.wordpress.com/2008/11/09/select-button-group,则必须为 ButtonGroup 编写更大的工作区,但 Map 或 Set 应该适合那也是

标签: java swing coding-style code-reuse jcheckbox


【解决方案1】:

你应该使用一个集合结构来保存你的复选框和那些相关的类。 使用地图,您可以执行以下操作:

Map <JCheckBox,Class<U>> uCheck = new HashMap<JCheckBox,Class<U>>();

// 将您的复选框和 U 类添加到地图中

uCheck.put(checkBoxA, A.class);

现在,很容易根据复选框状态获取需要实例化的类的集合:

public Collection<Class<U>>  getEnabledClasses(<JCheckBox,Class<U>> checkMap) {
    List<Class<U>> result = new LinkedList<Class<U>>();
    for (Map.Entry<JCheckBox,Class<U>> entry:checkMap.entrySet()) {
        if (entry.getKey().isSelected()) {
            result.add(entry.getValue());
        }
    }
}

现在,调用 getEnabledUs(uCheck) 返回所选类的集合。如果集合为空,则没有选择,因此无事可做。

for (Class<U> u:getEnabledClasses(...)) {
    Constructor<U> cons = u.getConstructor(...);
    U instance = cons.newInstance(fileparameter);
    instance.doSomething(...);
}

这应该让你开始。 (*) 免责声明:这是未经测试的代码。而是仅在需要时使用具有清晰细节的伪代码。

【讨论】:

  • 太棒了!非常感谢你。我不得不使用 Class 对于我的情况并出于性能原因使用 ArrayList 而不是 LinkedList。除了这些,其他一切如你所愿。代码现在看起来很棒。
  • 抱歉有问题的语法错误。我的意思是输入“帮助我避免......”:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
  • 1970-01-01
  • 2021-04-28
  • 2019-01-02
  • 2012-11-17
  • 1970-01-01
  • 2017-09-16
相关资源
最近更新 更多