如何在 Java 中使用 JCheckBox 避免冗余编码

发布于 2024-12-01 08:57:24 字数 998 浏览 1 评论 0 原文

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

我就是这样做的。

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. 这只是一个示例代码。原始版本有 8 个复选框和类,未来还会有更多。
  2. 我无法继续添加 || checkboxD.isSelected() 每次我有一个新类来检查它时。
  3. 同样的事情。我无法继续为每个类添加 if(checkboxD.isSelected()) new D(file);

这是非常不优雅的。我可以使用某种循环来删除冗余代码吗?

请给我你的建议。 谢谢。

I have a set of classes that implement a particular interface and I have a set of checkboxes. I want to throw an error if no checkboxes are selected. If atleast one or more checkboxes are selected, then it should create objects associated with that checkbox.

This is how I done.

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);
    }
}

Now I have 3 problems.

  1. This is just a sample code. Original has 8 checkboxes and classes with more coming.
  2. I can't keep adding || checkboxD.isSelected() every time I have a new class for checking it.
  3. Same thing. I can't keep adding if(checkboxD.isSelected()) new D(file); for every class.

It is very inelegant. Can I have some kind of loop that removes the redundant code?

Please give me your suggestions.
Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

定格我的天空 2024-12-08 08:57:24

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

Map >; uCheck = new HashMap>();

// 将复选框和 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(...);
}

这应该可以帮助你开始。
(*) 免责声明:这是未经测试的代码。相反,仅在需要的地方使用具有清晰细节的伪代码。

You should use a collection structure to hold your checkboxes and those related classes.
Using a Map you could do something like this:

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

// add your checkboxes and U-classes to the map

uCheck.put(checkBoxA, A.class);

Now, it's quite easy to get a collection of the classes that need to be instantiated based on the checkbox status:

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());
        }
    }
}

Now, a call to getEnabledUs(uCheck) returns a collection of the selected classes. If the collection is empty, there's no selection, hence nothing to do.

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

That should get you started.
(*) Disclaimer: this is non-tested code. Rather pseudo-code with crisp detail only where needed.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文