【问题标题】:How do I get the text from a textfield when a button is pressed?按下按钮时如何从文本字段中获取文本?
【发布时间】:2018-02-26 21:00:45
【问题描述】:

我是编程界的新手,所以我的技能真的很差。无论如何,我必须为一个学校项目编写一个程序,所以我想出了一个看起来简单的程序。 基本上,我只有一个框架、一个按钮、一个面板(稍后将使用)和两个文本字段。我需要当我在第一个文本字段中写一些东西并按下按钮时,文本将被扫描并放入一个变量中(稍后必须处理)。事实是我不认为我做对了(就像我说的,我只是一个初学者),我不知道如何得到我想要的。 代码如下:

import java.awt.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.awt.event.*;
import java.io.*;
import java.util.Timer.*;
import java.util.TimerTask.*;
import java.util.Scanner.*;
import java.lang.*;
import javax.sound.sampled.*; 

public class ExamProgram {

public TextField scrivi;
public TextField vuraid;
public Button b;
public String s;


 static class int timer4action(){return 0;}

 static class chiusura implements WindowListener { 
 public void windowClosing (WindowEvent ev) {System.exit(0);} 
 public void windowClosed (WindowEvent ev) {} 
 public void windowOpened (WindowEvent ev) {} 
 public void windowActivated (WindowEvent ev) {} 
 public void windowDeactivated (WindowEvent ev) {} 
 public void windowIconified (WindowEvent ev) {} 
 public void windowDeiconified (WindowEvent ev) {} 
}  //Window events

public ExamProgram(){ //Constructor
    //Frame inizialization
    Frame f = new Frame ("Artificial wife");
    f.setLayout(null);
    f.setBackground(Color.white);
    Image icona = Toolkit.getDefaultToolkit().getImage("src\\img\\Kurisu_profile.png");
    f.setIconImage(icona);
    f.setSize(800,600);
    f.setVisible(true);
    f.setResizable(false);
    f.addWindowListener(new chiusura());
    //Menù initialization.
    MenuBar mb = new MenuBar();
    Menu m1 = new Menu("File");
    Menu m2 = new Menu("Opzioni");
    Menu m3 = new Menu("Aiuto");
    MenuItem mi1 = new MenuItem("Nuovo");
    MenuItem mi2 = new MenuItem("Carica");
    MenuItem mi3 = new MenuItem("Chiudi");
    MenuItem mi4 = new MenuItem("Cambia lingua");
    MenuItem mi5 = new MenuItem("FAQ");
    MenuItem mi6 = new MenuItem("Manuale Elettronico");
    m1.add(mi1); m1.add(mi2); m1.add(mi3);
    m2.add(mi4);
    m3.add(mi5);m3.add(mi6); 
    mb.add(m1); mb.add(m2); mb.add(m3);
    f.setMenuBar(mb);
    //Panel initialization
    Panel waifu = new Panel();
    waifu.setBackground(Color.PINK);
    waifu.setBounds(25, 50, 750, 450);
    waifu.setVisible(true);
    f.add(waifu);
    //Textfield n°1 initialization
    scrivi = new TextField();
    scrivi.setVisible(true);
    scrivi.setBackground(Color.pink);
    scrivi.setBounds(200,530, 400, 30);
    f.add(scrivi);

    //Button initialization
    b = new Button("Send");
    b.setBackground(Color.PINK);
    b.setBounds(650, 530, 50, 30);
    f.add(b);

    //Event and Textfield n°2 initialization
    vuraid = new TextField();
    vuraid.setVisible(true);
    vuraid.setEditable(false);
    vuraid.setBackground(Color.green);
    vuraid.setBounds(200,570, 400, 30);
    f.add(vuraid);
    b.addActionListener(new send());

}

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

以及我想从事件中得到的动作:

import java.lang.*;
import java.awt.*;
import java.awt.event.*;

public class send implements ActionListener
{

    public void actionPerformed(ActionEvent e)
    {
       String textDialogue = new String();
       textDialogue = scrivi.getText();
       vuraid.setText(textDialogue);
    }
}

希望我能恰当地表达自己,以便您能得到我想问的问题。我试图删除所有意大利语文本,以使代码更易于理解。 非常感谢您的关注。

【问题讨论】:

    标签: java events applet textfield


    【解决方案1】:

    您的send 类需要引用包含信息的对象(即文本字段)

    “最简单”的解决方案是通过 send 类的构造函数将文本字段的引用传递给它

    b.addActionListener(new send(vuraid));
    

    您显然需要更新 send 类以支持此功能

    public class send implements ActionListener {
        private TextField vuraid
    
        public send(TextField vuraid) {
            this.vuraid = vuraid;
        }
        //...
    

    这是一个比较常见的概念。更多详情请见Passing Information to a Method or a Constructor

    警告词。您主要使用基于 AWT 的组件。 AWT 在 18 多年前被 Swing 取代,您可能需要考虑更新

    我还鼓励您了解布局管理 API 的工作原理,因为它可以解决您在不同计算机之间遇到的许多常见问题。

    首先查看Laying Out Components Within a Container了解更多详情

    你通常也会发现移动

    f.setSize(800,600);
    f.setVisible(true);
    f.setResizable(false);
    

    main 方法的末尾并按以下顺序调用它们

    f.setResizable(false);
    f.setSize(800,600);
    f.setVisible(true);
    

    这解决了首次显示 UI 时组件不可见的问题。使用setResizable时还有一些注意事项需要考虑,因为它可以改变窗口边框的大小并改变可用的窗口大小

    【讨论】:

      【解决方案2】:

      我首先建议在您的示例中格式化代码,因为它已经过时了。除此之外,请描述您遇到的问题。我运行了您的示例,它似乎运行良好。

      我输入了第一个文本字段的一些文本,点击发送,文本显示在第二个文本字段上。那到底是什么问题呢?

      除此之外,我建议对代码进行一些更改。首先,与其创建一个实现ActionListener 的新类,不如使用匿名类来获得相同的功能。而不是b.addActionListener(new send());,你可以这样做:

      b.addActionListener(new ActionListener() {
              @Override
              public void actionPerformed(ActionEvent e) {
                  //your logic goes here...
              }
          });
      

      你可以用一个 lambda 表达式在单行中做同样的事情:

      b.addActionListener(e -> {
              // logic goes here
          });
      

      在这两种情况下,您都绕过了创建新类的新需求。说到这里,我建议你检查一下关于类命名的命名约定。实现ActionListener 的名为send 的类名应以大写字母开头,所有类也应如此。

      在所有情况下,请避免这样做String something = new String();。这将有效地创建一个不需要的新 String 对象,并可能导致发生意外的事情(查看此处了解更多 Java Strings: "String s = new String("silly");")。

      在所有情况下,请重新格式化代码并解释您遇到的确切错误。

      【讨论】:

      • 在纠正这个问题时...MadProgrammer 抓住了我的错误,我应该注意到各种 textFields 被声明在范围之外...
      【解决方案3】:

      动作侦听器应该添加到按钮,因为您希望按钮单击时文本字段中的文本如下:

      b = new Button("Send");
      b.setBackground(Color.PINK);
      b.setBounds(650, 530, 50, 30);
      b.addActionListener(this);
      f.add(b);
      

      另外删除代码中的b.addActionListener(new send());行(语法错误)

      用于从 Textfield1 中获取文本并在单击按钮时将其显示在 Textfield2 中:

      public void actionPerformed(ActionEvent e)
      {
      String textDialogue = scrivi.getText();
      vuraid.setText(textDialogue);
      }
      }
      

      一切顺利!

      【讨论】:

      • 另外我建议你遵循 Java 中的命名约定,比如类名应该以大写字母开头。
      【解决方案4】:

      基本上,每当您按下按钮时,您都希望该类您已经制作的类...

      所以让我们在你的class 中说ExamProgram,你会这样做:

      public class ExamProgram {
          //Additional information here...
      
          public ExamProgram() {
              //Additional information here...
      
              theHandler handler=new theHandler();
              someTextField.addActionListener(handler);
          }
      
          public class theHandler implements ActionListener {
              @Override
              public void actionPerformed(ActionEvent e) {
                  if (e.getSource() == someTextField) {
                      //Button Pressed Actions Go here...
                  }
              }
          }
      }
      

      theHandler Action Listener 类用于测试是否按下该按钮,以及按下该按钮时会发生什么...

      现在,如果您不(或不能)这样做,那么您必须这样做......

      在这一部分中,您的组件必须是 staticfinal...

      final JTextField someTextField=new JTextField("Example");
      
      someTextField.addActionLister(new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
              //Button Pressed Actions Go here...
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-10
        • 2021-11-18
        • 1970-01-01
        • 2017-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多