【问题标题】:Unable to resolve field in Java when storing values from JTextField从 JTextField 存储值时无法解析 Java 中的字段
【发布时间】:2017-10-03 12:41:37
【问题描述】:

我在使用ActionListenerJButton 存储值时遇到问题。我对 Java 还很陌生,对类和子类的编程方式不是 100% 有信心。

import java.ActionEvent;
import javaActionListener;
import javax.swing JButton;
import javax.swing JPanel;
import javax.swing.JTextField;

public class Trial extends JPanel implements Action Listener {

    private static final long serialVersionUID = 1L;

    public Trial() {
        setFrame();
    }

    public void setFrame(){

        JFrame frame = new JFrame("Trial");
        JPanel panel = new JPanel();
        JTextField field = new JTextField(10);
        JButton button = new JButton("Enter");
        button.addActionListener(this);

        panel.add(field);
        panel.add(button);

        frame.add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new Trial();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String s = field.getText();
        System.out.prinln("Button is pressed");
    }
}

actionPerformed 中的字段未定义,为什么会这样?我玩过ActionEvent,似乎我无法传入actionPerformed 函数之外的任何变量。那么我该怎么做呢?我需要将setFrame() 移动到它自己的班级吗?

【问题讨论】:

  • 为什么Trial 扩展JPanel?它似乎完全没有必要这样做。
  • 代码只是原始代码的sn-p。我只是为这个问题准备了必要的代码行。

标签: java jtextfield actionevent


【解决方案1】:

问题的原因在于变量字段的范围。

在 java 中,变量的范围由定义它的代码块设置。您的 JTextField 字段在 setFrame 方法中声明,这意味着该变量仅在 setFrame 方法中可见。

如果您想让字段变量在整个类中可见,以便您可以在您的 actionPerformed 方法中访问它,您可以将其设为实例变量。

public class Trial extends JPanel implements Action Listener {

    private static final long serialVersionUID = 1L;
    private JTextField field;    //Move your declaration to class level, making it an instance variable.

    public Trial() {
        setFrame();
    }

    public void setFrame(){

        JFrame frame = new JFrame("Trial");
        JPanel panel = new JPanel();
        field = new JTextField(10);    //Remove the declaration of the variable and just initialize it here.
        JButton button = new JButton("Enter");
        button.addActionListener(this);

        panel.add(field);
        panel.add(button);

        frame.add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new Trial();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String s = field.getText();   //Now you can access field within any method in the class.
        System.out.prinln("Button is pressed");
    }
}

希望上面的代码已经足够解释了,有任何问题请评论,我会详细说明。

【讨论】:

    【解决方案2】:

    您的 setFrame() 方法创建并初始化该字段,但另一个方法无法访问具有特定属性的特定对象。

    试试这个:

        public class Trial extends JPanel implements Action Listener {
    
        JTextField field;
    
        ..// omitted 
    
        public void setFrame()
        {
           JFrame frame = new JFrame("Trial");
           JPanel panel = new JPanel();
           field = new JTextField(10);
    
         .. //omitted
    

    当在任何方法之外声明 -certain- 对象时,这意味着任何方法都可以访问此 -certain- 对象并从中修改(或检索)属性/方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多