【问题标题】:How to read a value from keyboard using Swing interface如何使用 Swing 接口从键盘读取值
【发布时间】:2020-11-11 23:49:43
【问题描述】:

我正在寻找一个简单的示例来解释如何从文本字段中读取一个简单的值以在我的程序中使用。我看到了很多复杂的例子,很多行,但不幸的是,我还没有找到一个简单的例子来让我明白。我有一个简单的用户界面:一个文本字段和一个按钮。我在文本字段中输入一些内容,然后单击按钮后,我希望程序首先声明的变量“a”具有来自文本字段的值。我写了一个程序,但我得到一个错误消息“来自内部类的局部变量必须是最终的”,请有人帮助我吗?

package arbitru;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class Listen1 {
    public static void main(String[] args) {
        
        String a; //variable 
        
        JFrame f=new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(new Dimension(300,300));
        
        JPanel panou=new JPanel();
        panou.setLayout(new FlowLayout());
        
        JLabel leb=new JLabel("Message");
        JButton butt=new JButton("Record");
        JTextField text=new JTextField(20);
        
        panou.add(leb);
        panou.add(text);
        panou.add(butt);
        
        butt.addActionListener(new ActionListener(){
        @Override
            public void actionPerformed(ActionEvent e){
                a=text.getText();
            }
            });
        
        System.out.println(a);
        
        f.getContentPane().add(panou); 
        f.setVisible(true);
        
    }
}

【问题讨论】:

  • 这个问题的开始是试图把所有东西都塞进main方法。为它的大部分创建一个构造函数。将a 字段设为类属性。
  • “我无法解释为什么?” 添加一个“?”陈述并不能使其成为问题,就像扩展您的问题并不能使其成为答案一样!使用edit 链接(实际问题区域的左下方)进行更新。

标签: java swing compiler-errors jtextfield


【解决方案1】:

您的代码看起来不错,但您不能在该动作侦听器的范围内分配变量 a。

快速修复:

public class Listen1 {

    private static String a; // moved the variable here 

    public static void main(String[] args) {
        
       // ... same code as before apart from the variable
        
    }
}

另外,system.out 总是会打印 null。 如果要在按下按钮时打印出数值;然后将 System.print 移动到 actionlistener

【讨论】:

  • private static String a; 除非你能解释使用static 的设计逻辑(/必要性),否则你就是在误用它。别。做。那个。
  • 就像我说的,代码是一种快速的解决方法,要从静态的主块中访问变量,变量需要是静态的。我并不是说这是一个好的设计,这是一个不同的故事......
【解决方案2】:
  1. 你不能像这样使用 20

     JTextField text=new JTextField(20);
    

你需要先调用构造函数 然后将文本字段设置为“20”

        JTextField text=new JTextField();
        text.setText("20");

显然你需要将 a 变成 String a 变成最后一个元素数组 这是一个解释:

Why should I "Transform myVariable to final one element array"?

Lambdas: local variables need final, instance variables don't

   public static void main(String[] args) {

             final String[] a = new String[1]; //variable

            JFrame f=new JFrame("Test");
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setSize(new Dimension(300,300));

            JPanel panou=new JPanel();
            panou.setLayout(new FlowLayout());

            JLabel leb=new JLabel("Message");
            JButton butt=new JButton("Record");
            JTextField text=new JTextField();
            text.setText("20");

            panou.add(leb);
            panou.add(text);
            panou.add(butt);

            butt.addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e){
                   a[0] =  text.getText();
                    System.out.println( text.getText());

                }
            });


            f.getContentPane().add(panou);
            f.setVisible(true);

        }
    }

附注: 如果您是 java gui 新手,我会推荐使用 netBeans

【讨论】:

  • 不起作用,关闭 Swing 窗口后,我想为变量显示新值,我给出 System.out.println(a) 命令,但在我的输出中没有出现值程序。
  • “你不能这样用20”你当然can“如果您是 java gui 新手,我建议您使用 netBeans” 如果您是(编程或)回答问题的新手,我建议您使用 API 文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 2011-07-16
相关资源
最近更新 更多