繁体   English   中英

按下按钮时如何从文本字段中获取文本?

[英]How do I get the text from a textfield when a button is pressed?

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

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);
    }
}

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

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

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

b.addActionListener(new send(vuraid));

您显然需要更新send类以支持此操作

public class send implements ActionListener {
    private TextField vuraid

    public send(TextField vuraid) {
        this.vuraid = vuraid;
    }
    //...

这是一个相对普遍的概念。 有关更多详细信息,请参见将信息传递给方法或构造函数

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

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

首先查看在容器布置组件以了解更多详细信息

您通常还会发现

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

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

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

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

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

我输入了第一个文本字段的一些文本,然后单击发送,并且该文本显示在第二个文本字段中。 那么到底是什么问题呢?

除此之外,我建议对代码进行一些更改。 首先,与其创建一个实现ActionListener的新类, ActionListener使用Anonymous类来获得相同的功能。 代替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 something = new String(); 这将有效地创建一个新的String对象,该对象没有被修饰,并可能导致意外情况发生(请在此处查看更多Java Strings:“ String s = new String(” silly“);” )。

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

应将动作侦听器添加到Button,因为您希望单击Button上的Textfield中的文本,如下所示:

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);
}
}

祝一切顺利!

基本上,每当您按下按钮时,您都希望该课程您已经完成的课程中...

因此,假设您在名为ExamProgramclass执行以下操作:

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...
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM