【问题标题】:GUI with text fields for input using Swing带有用于使用 Swing 输入的文本字段的 GUI
【发布时间】:2014-06-16 03:26:33
【问题描述】:

实际上我是一个初学者,所以我尝试自己使用 Swing 创建 GUI,其中两个输入数字由用户在两个相应的字段中填写,所以有一个新的文本字段,我想在其中添加 2 个输入值。

我想添加 2 个文本字段的整数并添加两个值并显示在另一个文本字段中。如何将JTextField 整数值提取到另一个JTextField

import java.io.*;
 import java.awt.*;
 import java.awt.event.*;
import javax.swing.*;
public class GUI
{
public JFrame f;
    public JPanel p;
    public JLabel l1,l2;
    public JButton b1;
    public JButton b2;
    public JTextField t1;
    public JTextField t2;
    public JTextField t3;
    public GUI()
        {
            f=new JFrame("hello world application");
            p=new JPanel(true);
            l1=new JLabel("enter first number");
            t1=new JTextField(30);
            l2=new JLabel("\n enter the second number");
            t2=new JTextField(30);
            t3=new JTextField(30);
            b1=new JButton("check here");
            b2=new JButton("clear all");
            //b1.addActionCommand1("checking....");
            //b2.addActionCommand2("clearing all input's ....");

        }
    public void launch()
        {
            f.setSize(400,500);
            p.add(l1);
            p.add(t1);
            p.add(l2);
            p.add(t2);
            p.add(t3);
            p.add(b1);
            p.add(b2);
            f.pack();
            f.add(p);

            //l.setFont(Times Roman);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            p.setSize(400,500);
            p.setForeground(Color.red);
            p.setBackground(Color.green);
            f.setLayout(new BorderLayout());
            b1.addActionListener(new Button1handler(t1,t2,t3));
            b2.addActionListener(new Button2handler());
            f.setVisible(true);


        }
    public static void main(String a[])
        {
            javax.swing.SwingUtilities.invokeLater(new Runnable()
                {
                    public void run()
                        {
                            GUI br=new GUI();
                            br.launch();

                        }
                });
        }
}

 class Button1handler implements ActionListener 
{

              private JTextField t1;
     private JTextField t2;
     private JTextField t3;
             public Button1handler(JTextField t1, JTextField t2, JTextField t3) 
                   {
                   this.t1 = t1;
                   this.t2 = t2;
                   this.t3 = t3;
    }
      public void actionPerformed(ActionEvent e)
        {
    System.out.println("action occurred for checking");
    String firstnumber=t1.getText();
    String secondnumber=t2.getText();
    int num1=Integer.parseInt(firstnumber);
    int num2=Integer.parseInt(secondnumber);
    int sum=num1+num2;
            String str=Integer.toString(sum);
            String sum2=t3.setText(str);
   JOptionPane.showMessageDialog( null, "The sum is " + sum,"Sum of Two Integers", JOptionPane.PLAIN_MESSAGE );



        }
}
class Button2handler implements ActionListener
{
    public void actionPerformed(ActionEvent r)
        {
            System.out.println("clearing all");

        }
}           

在这个编辑的代码中,我可以在消息对话框中检索总和值。问题是我可以在第三个 JtextField 中获取特定的字符串。它在这一行显示错误: //错误:不兼容的类型 字符串 sum2=t3.setText(str); 必需:字符串 发现:无效 1个错误:(

【问题讨论】:

    标签: java swing jtextfield


    【解决方案1】:

    如果不运行代码,这里就有问题了……

    t3.setText(total);
    

    因为JTextField 没有setText(int) 方法。相反,您需要将值转换为 String

    您可以使用Integer.toString(total),但使用NumberFormat.getNumberInstance().format(total)) 可能会给您带来更好的结果,例如

    t3.setText(NumberFormat.getNumberInstance().format(total));
    

    更新

    你遇到的“其他”问题让我在圈子里跑来跑去,Button1handler 扩展了GUI

    class Button1handler extends GUI implements ActionListener {
    

    这意味着,当它访问字段 t1t2 时,它会得到空值,因为这些字段与屏幕上的字段不同。

    如果您的ActionListener 位于外部文件/类中,则需要为该类提供上下文,例如...

    class Button1handler implements ActionListener {
    
        private JTextField f1;
        private JTextField f2;
        private JTextField f3;
    
        public Button1handler(JTextField f1, JTextField f2, JTextField f3) {
            this.f1 = f1;
            this.f2 = f2;
            this.f3 = f3;
        }
    
        public void actionPerformed(ActionEvent e) {
            int firstnumber = Integer.parseInt(f1.getText());
            int secondnumber = Integer.parseInt(f2.getText());
            int total = firstnumber + secondnumber;
            f3.setText(NumberFormat.getNumberInstance().format(total));
        }
    }
    

    然后您需要使用类似...的东西创建动作处理程序的新实例

    b1.addActionListener(new Button1handler(t1, t2, t3));
    

    这为操作处理程序提供了对用户在屏幕上操作的实际字段的引用...

    您可能对Nested Classes 感兴趣,它为您提供了一些额外的功能来满足这个要求(必须传递引用),但是在移动到它之前,您应该非常了解对象的上下文;)

    【讨论】:

    • 你能解释一下这段代码吗:t3.setText(NumberFormat.getNumberInstance().format(total));尽管它会引发有关“NumberFormat”的错误
    • “引发错误”或生成编译器错误?如果是编译器错误,您可能没有导入 NumberFormat。你在使用 IDE 吗?
    • @AndrewG 它会(最终)在Integer.parseInt(f1.getText()) 处抛出NumberFormatException,因为该字段由于引用问题而为空
    • 我也试过了,还是报错error:cannot find symbol symbol:variable NumberFormat location:Button1handler
    • import java.text.NumberFormat 添加到导入部分
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 2021-03-15
    • 1970-01-01
    • 2019-06-10
    相关资源
    最近更新 更多