【问题标题】:How to store string or integer in java.swing JTextField?如何在 java.swing JTextField 中存储字符串或整数?
【发布时间】:2016-04-21 03:07:12
【问题描述】:

您好,我正在做这个项目来存储学生姓名并记录他们的成绩。我已经规划了整个程序,我现在需要做的就是记录来自用户输入的整数和字符串,并从不同的类中调用它。我遇到了麻烦。我使用数组吗?我如何从另一个班级打电话?谢谢。

    package gradebook;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.util.Scanner;
import java.awt.event.ActionEvent;
import javax.swing.JTextArea;

public class Student extends JFrame {
    private JFrame studentFrame;
    private JPanel contentPane;
    private JTextField studentNameTextField;
    protected Component frame;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Student frame = new Student();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Student() {

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JLabel gradebookLabel = new JLabel("Gradebook");
        gradebookLabel.setBounds(189, 6, 68, 16);
        contentPane.add(gradebookLabel);

        JLabel lblPleaseEnterThe = new JLabel("Please enter the student name");
        lblPleaseEnterThe.setBounds(130, 105, 194, 16);
        contentPane.add(lblPleaseEnterThe);

        studentNameTextField = new JTextField("Enter here");
        String stdname = studentNameTextField.getText();
        studentNameTextField.setBounds(130, 133, 194, 26);
        contentPane.add(studentNameTextField);
        studentNameTextField.setColumns(10);

        JButton continueButton = new JButton("Continue");
        continueButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent a) {
                if(continueButton.isEnabled()){
                Student.this.dispose();
                    Student studentScreen = new Student();
                    studentScreen.dispose();

                    AddGrades addGradesScreen = new AddGrades();
                    addGradesScreen.setVisible(true);


                }
            }
        });
        continueButton.setBounds(327, 243, 117, 29);
        contentPane.add(continueButton);

        JButton cancelButton = new JButton("Cancel");
        cancelButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent a) {


                if(cancelButton.isEnabled()){




                    MainScreen mainScreenScreen = new MainScreen();
                    mainScreenScreen.setVisible(true);
                    contentPane.setVisible(false);
                    contentPane.disable();


                }
            }
        });


        cancelButton.setBounds(207, 243, 117, 29);
        contentPane.add(cancelButton);
    }

    private void initizalize() {
        // TODO Auto-generated method stub

    }
}

是这样的吗?

studentNameTextField = new JTextField("Enter here");
        String stdname = studentNameTextField.getText();

我知道这会存储它,但我如何在不同的类中调用它,以便让它出现在不同的框架上?

更新:好的,我已经这样做了

Student frame = new Student();
        String stdname = frame.studentNameTextField.getText();
        JLabel addgradesLabel = new JLabel("Add grades for" + frame.studentNameTextField);
        addgradesLabel.setBounds(139, 34, 167, 29);
        contentPane.add(addgradesLabel);

它仍然无法正常工作。我相信我没有正确实施这一点。我正在尝试使用用户输入的名称来命名标签。所以它只会“添加成绩”+ stdname 但它没有正确调用它。我该如何解决这个问题?

这是我在 AddStudentName 类中的代码

studentNameTextField = new JTextField();
        studentNameTextField.setBounds(130, 133, 194, 26);
        contentPane.add(studentNameTextField);
        studentNameTextField.setColumns(10);

        JButton continueButton = new JButton("Continue");
        continueButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent a) {
                if(continueButton.isEnabled()){
                Student.this.dispose();
                    Student studentScreen = new Student();
                    studentScreen.dispose();


                    AddGrades addGradesScreen = new AddGrades();
                    addGradesScreen.setVisible(true);




                }
            }
        });

我应该在此处添加什么来保存用户输入到 JTextField 中的输入?感谢您的帮助

这是类的完整代码:

package gradebook;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.util.Scanner;
import java.awt.event.ActionEvent;
import javax.swing.JTextArea;

public class Student extends JFrame {
    private JFrame studentFrame;
    private JPanel contentPane;
    public JTextField studentNameTextField;
    protected Component frame;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Student frame = new Student();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Student() {

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JLabel gradebookLabel = new JLabel("Gradebook");
        gradebookLabel.setBounds(189, 6, 68, 16);
        contentPane.add(gradebookLabel);

        JLabel lblPleaseEnterThe = new JLabel("Please enter the student name");
        lblPleaseEnterThe.setBounds(130, 105, 194, 16);
        contentPane.add(lblPleaseEnterThe);


        JTextField studentNameTextField = new JTextField();

        studentNameTextField.setBounds(130, 133, 194, 26);
        contentPane.add(studentNameTextField);
        studentNameTextField.setColumns(10);

        JButton continueButton = new JButton("Continue");
        continueButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent a) {
                if(continueButton.isEnabled()){

                    Student studentScreen = new Student();
                    studentScreen.dispose();

                    AddGrades addGradesScreen = new AddGrades();
                    addGradesScreen.setVisible(true);



                }
            }
        });


        continueButton.setBounds(327, 243, 117, 29);
        contentPane.add(continueButton);

        JButton cancelButton = new JButton("Cancel");
        cancelButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent a) {


                if(cancelButton.isEnabled()){




                    MainScreen mainScreenScreen = new MainScreen();
                    mainScreenScreen.setVisible(true);
                    contentPane.setVisible(false);
                    contentPane.disable();


                }
            }
        });


        cancelButton.setBounds(207, 243, 117, 29);
        contentPane.add(cancelButton);
    }

    private void initizalize() {
        // TODO Auto-generated method stub

    }
}

和:

package gradebook;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class AddGrades extends JFrame {

    private JPanel contentPane;
    private JTextField Assignment1;
    private JTextField Assignment2;
    private JTextField Assignment3;
    private JTextField Assignment4;
    private JLabel testsLabel;
    private JTextField Test1;
    private JTextField Test2;
    public JTextField Test3;
    public JTextField Test4;

    /**
     * Launch the application.
     */
    public JFrame frame;
    public JButton continueButton;
    public JButton exitButton;
    public static void main(String[] args) {
        AddGrades frame = new AddGrades();
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    AddGrades frame = new AddGrades();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public AddGrades() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JLabel gradebookLabel = new JLabel("Gradebook");
        gradebookLabel.setBounds(189, 6, 68, 16);
        contentPane.add(gradebookLabel);


        JLabel addgradesLabel = new JLabel("Add grades for" + stdname);
        addgradesLabel.setBounds(139, 34, 167, 29);
        contentPane.add(addgradesLabel);

        JLabel assignmentsLabel = new JLabel("Assignments:");
        assignmentsLabel.setBounds(19, 75, 86, 16);
        contentPane.add(assignmentsLabel);

        Assignment1 = new JTextField();
        Assignment1.setBounds(54, 91, 130, 26);
        contentPane.add(Assignment1);
        Assignment1.setColumns(10);

        Assignment2 = new JTextField();
        Assignment2.setBounds(54, 129, 130, 26);
        contentPane.add(Assignment2);
        Assignment2.setColumns(10);

        Assignment3 = new JTextField();
        Assignment3.setBounds(54, 167, 130, 26);
        contentPane.add(Assignment3);
        Assignment3.setColumns(10);

        Assignment4 = new JTextField();
        Assignment4.setBounds(54, 205, 130, 26);
        contentPane.add(Assignment4);
        Assignment4.setColumns(10);

        testsLabel = new JLabel("Tests:");
        testsLabel.setBounds(243, 75, 38, 16);
        contentPane.add(testsLabel);

        Test1 = new JTextField();
        Test1.setBounds(262, 91, 130, 26);
        contentPane.add(Test1);
        Test1.setColumns(10);

        Test2 = new JTextField();
        Test2.setBounds(262, 129, 130, 26);
        contentPane.add(Test2);
        Test2.setColumns(10);

        Test3 = new JTextField();
        Test3.setBounds(262, 167, 130, 26);
        contentPane.add(Test3);
        Test3.setColumns(10);

        Test4 = new JTextField();
        Test4.setBounds(262, 205, 130, 26);
        contentPane.add(Test4);
        Test4.setColumns(10);

        continueButton = new JButton("Continue");
        continueButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent a){
                if (continueButton.isEnabled()){

                    MainScreen mainScreenScreen = new MainScreen();
                    mainScreenScreen.setVisible(true);

                }


            }
        });
        continueButton.setBounds(327, 243, 117, 29);
        contentPane.add(continueButton);

        exitButton = new JButton("Exit");

        exitButton.setBounds(208, 243, 117, 29);
        contentPane.add(exitButton);
    }
}

我正在尝试从 JTextField 获取输入

JTextField studentNameTextField = new JTextField();

并将其设置在标签上

JLabel addgradesLabel = new JLabel("Add grades for" + stdname);

其中 stdname 是来自 JTextField 的用户输入。

现在我收到来自

的错误
public static void main(String[] args) {
        AddGrades frame = new AddGrades();
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    AddGrades frame = new AddGrades();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

AddGrades 框架 = new AddGrades();给我错误添加参数以匹配 AddGrades(String)

构造函数 AddGrades() 未定义

【问题讨论】:

  • 你如何调用另一个类的什么?澄清你的问题。乍一看,您似乎需要学习一些关于 Java 和 OOP 的一般知识。
  • 现在应该回答 - 看我的编辑。

标签: java arrays swing input


【解决方案1】:

编辑:最好的方法是将参数传递给新创建的 AddGrades 类。见下文:

public AddGrades(String stdname) {
    JLabel addgradesLabel = new JLabel("Add grades for " + stdname);
}

您需要修改代码以将字符串传递给您创建的 AddGrades 类:

JButton continueButton = new JButton("Continue");
continueButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent a) {
        if(continueButton.isEnabled()){

            Student studentScreen = new Student();
            studentScreen.dispose();

            AddGrades addGradesScreen = new AddGrades(studentNameTextField.getText());
            addGradesScreen.setVisible(true);
        }
    }
});

这对我有用 - 我下载了您的代码并对其进行了测试。

【讨论】:

  • 我已经尝试过了,但我相信我没有正确实施。我已经用更多代码更新了我的原始帖子。谢谢
  • @Adam 根据您的代码,您似乎没有给用户时间输入任何内容 - 显示 Student 框架,然后立即创建一个新标签。发生这种情况时,用户尚未输入文本。解决此问题的方法是使用动作侦听器。我会更新我的答案。
  • 我仍然无法执行您的建议。我将提供这两个类的完整代码给你,如果你不介意可以看一下吗?
  • @Adam 很高兴。因此,当用户输入名称并单击继续时,您希望新菜单填充用户名称吗?
  • 是的!我想获取用户在 JTextField 中输入的内容并将其放入 JLabel 中。将来我也想输入并保存他们的成绩。有没有一种简单的方法可以做到这一切?
【解决方案2】:

JSpinnerJFormattedTextField 是我的第一个想法,但如果你不能这样做,那么你可以使用Integer.parseIntString 解析为intNumberFormat 来格式化数字到Strings

初学者不妨看看How to Use SpinnersHow to Use Formatted Text Fields

我知道这会存储它,但我如何在不同的类中调用它,以便让它出现在不同的 JFrame 上?

这是一个没有上下文的开放式问题。您可能会使用某种“模型”来表示一个或多个 Student 值;您可以使用Observer Pattern 允许编辑器向感兴趣的各方生成事件,告诉他们某些事情发生了变化;你可以使用Model-View-Controller;您可以使用模态对话框,当它关闭时,通过 getter 向编辑器询问值。

查看How to Make Dialogs了解更多详情

您要记住的一件事是“责任”和“封装”。您不希望外部各方不受控制地访问您的编辑器或模型,这可能允许他们以不受控制的方式修改状态,从而导致您的数据或 UI 不一致。

您需要决定谁实际负责修改模型的状态。没有“正确”的答案,例如,您可以让编辑器能够编辑现有的学生对象或根据其配置方式创建新的对象,同样,您也可以让编辑器变得“愚蠢”并简单地使用 setter设置编辑器和 getter 以获取值。

您可以使用许多选项,您可以根据要使用它的上下文来使用它们。我的直觉是从观察者模式和模态对话框开始。

【讨论】:

  • 我真的很尊重你,你是回答问题的老板,所以没有不尊重,但我不认为这个答案是正确的。他的问题集中在如何从另一个类访问他的文本字段中的值,而这并没有解决这个问题。
  • @nhouser9 是的,标题和问题不匹配:P。检查更新,顺便说一下吹走封装的方法;)
猜你喜欢
  • 1970-01-01
  • 2022-11-02
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多