[英]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);
}
}
祝一切顺利!
基本上,每当您按下按钮时,您都希望该课程在您已经完成的课程中...
因此,假设您在名为ExamProgram
的class
执行以下操作:
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类将用于测试是否按下了该按钮,以及按下该按钮时会发生什么...
现在,如果您不这样做(或不能这样做),则必须执行此操作...
在此部分中,您的组件必须是static
或final
...
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.