【问题标题】:Getting Methods from another Class in Java从 Java 中的另一个类获取方法
【发布时间】:2013-10-05 15:04:13
【问题描述】:

我是 Java 新手,如果这是你听过的最愚蠢的话,请多多包涵。

所以,基本上我是在 Java 中创建一个表单。当它被提交时,它被验证,如果有错误,我希望特定的表单项变成红色。我已经通过调用方法 setAsError()

设法做到了
public void setAsError(){
    this.setBackground(new Color(230,180,180));
}

但问题是,我的表单项(包括文本字段、组合框和其他摆动类)已经扩展了 Java 组件。

public class KComboBox extends JComboBox {

public KComboBox(String[] s){
    super(s);
    //There's other stuff in here too
}

我想将 setAsError() 方法添加到我的表单项中。我意识到我可以将方法单独添加到所有必要的类中,但这对于 OO 编程来说似乎有点奇怪。

无论如何,最终结果应该是,当我这样做时

myFormItem.setAsError()

该字段应变为红色。

任何帮助将不胜感激,并提前致谢。

【问题讨论】:

    标签: java class methods add


    【解决方案1】:

    Java 支持多接口继承,允许一个对象从不同的接口继承许多方法签名。

    因此,使用setAsError 方法创建新的interface,为所有相关类添加实现。

    类似:

    public interface ErrorItf {
     public void setAsError();
    }
    

    之后,将其添加到您的课程中:

    public class KComboBox extends JComboBox implements ErrorItf{
    
    ...
    
      @override
      public void setAsError(){
        this.setBackground(new Color(230,180,180));
      }
    
    }
    

    现在改为调用您的类,通过接口调用,例如:

    ErrorItf element = getComboBox();
    element.setAsError(); 
    

    当你向一个对象(又名element.setAsError())发送消息时,即使你不知道它是JComboBoxJTextarea 的具体类型...。这就是所谓的多态性

    作为旁注,举例说明界面如何为您的案例提供帮助

    【讨论】:

    • 感谢您的帮助。但是,如果我使用接口来做,我是否不必在它实现的所有类中单独编写方法?我想知道是否有办法避免这种情况。
    • @KaneelDias 看看我关于如何在没有接口的情况下做到这一点的答案 :-)
    • 你的类有相同的方法实现吗?
    • 你为什么尽量避免使用接口?
    • 这不是一个大问题。我只是希望不要有任何重复的代码运行(从那时起,在所有实现接口的类中,我将不得不单独编写方法)。
    【解决方案2】:
    public void setAsError(JComponent component){
        if(component instanceof JTextField){
        JTextField field =  (JTextField) component;
        field.setBackground(Color.RED);
        }else if(component instance of JTextArea){
        JTextArea area = (JTextArea) component;
        area.setBackground(Color.RED);
        }
    }  
    

    只需将JComponent 参数添加到您的setError(),您就可以实现您想要的。

    现在,假设您发现用户将表单中的“姓名”字段留空。 当他/她点击提交按钮时,我确定您正在检查空状态。

    if(nameField.getText().equals("")){
        this.setAsError(nameField);
    }  
    

    现在,我很确定您需要将背景颜色重置为您发现错误已从该字段消失后的颜色,因此我建议您还创建一个resetError(JComponent compo),将颜色重置为默认值。
    现在,背景颜色可以从 Windows 到 Mac 再到 Ubuntu。您需要做的是在应用程序启动时获取背景颜色并将其存储。
    当错误情况消失后,将其设置为您存储的默认值。

    【讨论】:

    • 尽量避免instanceof
    • @MaximShoustin 那么OP将不得不求助于getClass().getName() :)
    • 这看起来很有趣,搜索时从未见过这样的答案。不过,在这个解决方案中,快速的问题是,setAsError() 方法会进入哪个类?我想以一种没有重复的方式做到这一点。
    • JFrame 类中:)
    • setBackground(Color)Component 的方法,因此instanceof 检查和强制转换是无用的,并且只是以一种比将方法放入每个类中更糟糕的方式复制代码,就像Maxim Shoustin 的解决方案一样。您也不能将此setAsError 消息放在JFrame 类中,因为您无法编辑该类。如果您确实只需要setBackground(Color),请创建一个实用程序类来保存public static void setAsError(JComponent c) { c.setBackground(Color.RED); },或者如果您可能需要自定义一些但不是所有组件,请使用单个if (c instanceof ErrorItf)
    【解决方案3】:

    您最好的选择是创建一个界面。随便写

    Interface SetAsErrorable{
        void setAsError();
    }
    

    在全局范围内(或在其自己的文件中)。然后添加到所有表单项类implements SetAsErrorable。即KComboBox extendsJComboBox implements SetAsErrorable{

    【讨论】:

      【解决方案4】:

      听起来像使用界面会很好......

      public interface errorInterface {
       public setAsError();
      }
      
      public class KComboBox extends JComboBox implements errorInterface {
      
       @Override
       setAsError() {
          this.setBackground(new Color(230,180,180));
       }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-08-29
        • 1970-01-01
        • 1970-01-01
        • 2022-08-17
        • 2016-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多