【问题标题】:have to access switchcase statement from another class using jtextfield必须使用 jtextfield 从另一个类访问 switchcase 语句
【发布时间】:2023-03-03 23:55:01
【问题描述】:

在下面的代码部分中,我创建了两个类。第一类是用于设计的,我保留了两个 jtextfield,一个用于获取字符串值,另一个用于获取数值。第二类是描述字符串和数字的函数,用于在 jtextfield 中显示值。我无法访问类文本字段中的字符串参数。

如果我将使用此代码,它将访问每个 jtextfield 中的两个函数。请给出这个问题的解决方案。

import java.awt.event.*;
import javax.swing.*;

public class valid implements KeyListener {
    perform1 per1=new perform1();
    String num1="Alpha";
    String num2="Numeric";
    String num3="Alphanumeric";
    JFrame fr=new JFrame();
    JPanel jp=new JPanel();
    JLabel label1=new JLabel("STUDENT NAME");
    JLabel label2=new JLabel("REG NO");
    JTextField text1=new JTextField(15);
    JTextField text2=new JTextField(15);
    public valid(){
        text1.addKeyListener(this);
        text2.addKeyListener(this);
        jp.add(label1);
        jp.add(text1);
        jp.add(label2);
        jp.add(text2);
        fr.add(jp);
        fr.setSize(450, 330);
        fr.setVisible(true);
    }

    public void keyTyped(KeyEvent e) {

    }

    public void keyPressed(KeyEvent e) {

    }

    public void keyReleased(KeyEvent e) {
        per1.dis(text1, e, num1);
        per1.dis(text2, e, num2);
    }
    public static void main(String ar[])
    {
        new valid();
    }

}
class perform1{
    public void dis(JTextField PTxtCtrl,KeyEvent PKeyvalue,String PTempStr){
        JLabel error=new JLabel();
        String TmpCurntStr;
        String TmpConvStr;
        value val = value.valueOf(PTempStr);

        switch(val){
            case Alpha:
                if(PKeyvalue.getKeyChar()>='a'&& PKeyvalue.getKeyChar()<='z'){
                    TmpCurntStr=PTxtCtrl.getText();
                    TmpConvStr=TmpCurntStr.toUpperCase();
                    PTxtCtrl.setText(TmpConvStr);
                   }else{
                    JOptionPane.showMessageDialog(error,"Enter only alpha");
                }

                break;
            case Numeric:
                if(PKeyvalue.getKeyChar()>='0'&& PKeyvalue.getKeyChar()<='9'){
                    TmpCurntStr=PTxtCtrl.getText();
                    System.out.println("hai");
                 }else{
                    JOptionPane.showMessageDialog(error,"Enter only numeric");
                }
                break;
            case Alphanumeric:
                break;
        }
    }
    enum value{
        Alpha,
        Numeric,
        Alphanumeric    
    }
}

【问题讨论】:

  • 根据命名约定,变量名称应以小写字母开头,遵循约定可以更容易阅读代码(并避免 HTML 标记中的混淆)
  • @BinyaminSharet 我同意你的观点,但我也注意到所有参数都以 P 为前缀,这让我相信 OP 是由坚持匈牙利表示法的人指示的,并与大多数参数保持一致我知道匈牙利记谱员,他可能会因为不符合教师决定的任何标准而被扣分。
  • @glowcode - 我没有意识到这一点。看起来很合理。
  • @glowcoder 一个糟糕的老师不是做错事的借口,甚至是违反约定的借口
  • @kleopatra 这太天真了。在现实世界中,您必须维护其他人编写的代码。我在一个由 10 名程序员组成的团队中,我是唯一一个不想使用匈牙利符号的人。这是真的。我一点也不喜欢。但作为程序员,我们必须适应。

标签: java swing


【解决方案1】:

问题是您对两个文本字段使用相同的 KeyListener。相反,请为每个文本字段使用不同的字段,如下所示:

class valid  {
    perform1 per1=new perform1();
    String num1="Alpha";
    String num2="Numeric";
    String num3="Alphanumeric";
    JFrame fr=new JFrame();
    JPanel jp=new JPanel();
    JLabel label1=new JLabel("STUDENT NAME");
    JLabel label2=new JLabel("REG NO");
    JTextField text1=new JTextField(15);
    JTextField text2=new JTextField(15);
    public valid(){
        text1.addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
                per1.dis(text1, e, num1);
            }

        });
        text2.addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
                per1.dis(text2, e, num2);
            }

        });
        jp.add(label1);
        jp.add(text1);
        jp.add(label2);
        jp.add(text2);
        fr.add(jp);
        fr.setSize(450, 330);
        fr.setVisible(true);
    }

    public static void main(String ar[])
    {
        new valid();
    }

}

【讨论】:

    【解决方案2】:

    我认为最好的解决方案是有两个类:

    class performString {
    
        public void perform(JTextField PTxtCtrl,KeyEvent PKeyvalue) {
            // work on strings here
        }
    
    }
    
    class performNumeric {
    
        public void perform(JTextField PTxtCtrl,KeyEvent PKeyvalue) {
            // work on numerics here
        }
    
    }
    

    稍后,您可以这样做

    public void keyReleased(KeyEvent e) {
        if(e.getSource() == label1) per1.perform(text1, e);
        else if(e.getSource() == label2) per2.perform(text2, 2);
    }
    

    【讨论】:

    • 好的,但是我必须使用更多函数,所以我想在同一个类中声明所有函数。然后我在许多类中访问这些函数,所以我想要这些单个类。请帮我解决这个问题。
    • 为什么要将它们都放在同一个类中?他们不属于同一类。他们有完全不同的行为,应该属于不同的类别。尽管该行为看起来像是在做类似的事情,但使其实际重用代码而不是巨大的 switch 语句所需的工作量比仅使用多个类要复杂得多。它们确实共享一个方法签名,因此它们可能应该有一个支持接口。
    • 如果您真的想将它们放在同一个类中,您可以使用performString 方法和performInteger 方法并适当地调用它们。我建议不要这样做,但它可以让你让他们在同一个班级,同时让他们分开,这样他们就不会意外地妨碍彼此。
    • 感谢您的热心帮助。
    • 请您回复我如何解决,因为 6classes 正在访问相同的方法。所以我需要在同一个类中使用这些功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 2012-09-05
    • 2016-05-27
    • 2013-05-18
    • 2019-08-03
    • 2011-10-15
    相关资源
    最近更新 更多