Java 如何从JTextField获取用户输入?
我正在尝试一个非常简单的表单,该表单旨在将用户输入带入JTextField,并通过弹出对话框显示相同的输入 我可以使用setText()将JTextField硬编码为具有预设编号。如果我这样做,我的程序就会完美无瑕 但是,当我将字段留空并尝试getText()在弹出对话框中显示文本时,我要么得到一个空的弹出框,要么得到一个“空字符串”异常(我试图将字符串解析为双精度) 任何帮助都将不胜感激。我正在使用KeyListener或KeyEvent进行研究,但我对其了解不够。您正在b2的ActionListener中创建一个“shadow”ButtonFrame变量。是,bf变量指的是ButtonFrame对象,该对象与显示的ButtonFrame对象属于同一类,但它指的是一个完全不同的非可视化对象。解决方案的关键是从实际显示的ButtonFrame对象中获取文本,这可以通过Java 如何从JTextField获取用户输入?,java,swing,jtextfield,Java,Swing,Jtextfield,我正在尝试一个非常简单的表单,该表单旨在将用户输入带入JTextField,并通过弹出对话框显示相同的输入 我可以使用setText()将JTextField硬编码为具有预设编号。如果我这样做,我的程序就会完美无瑕 但是,当我将字段留空并尝试getText()在弹出对话框中显示文本时,我要么得到一个空的弹出框,要么得到一个“空字符串”异常(我试图将字符串解析为双精度) 任何帮助都将不胜感激。我正在使用KeyListener或KeyEvent进行研究,但我对其了解不够。您正在b2的Action
ButtonFrame从内部类中获取。此结构:
b2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//!! ButtonFrame bf = new ButtonFrame();
if ("calculate".equals(e.getActionCommand())) {
//!! note use of ButtonFrame.this:
JOptionPane.showMessageDialog(frame, ButtonFrame.this.loanAmt.getText());
}
}
});
接下来考虑使用公共吸气剂,而不是直接访问JTeFieldE等字段。这减少了代码产生副作用的可能性,例如无意中更改JTextField对象的属性
例如(用//!!注释表示的更改):
您访问loanAmt的唯一方法是通过按钮面板本身。因为你在这个按钮上添加了loanAmt,对吗
因此,如果您想要访问loanAmt。您必须获取此按钮面板上的所有组件。这是我的psudeo代码,说明如何从ButtonPanel类访问您的loanAmt
b2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ButtonFrame bf = new ButtonFrame();
if("calculate".equals(e.getActionCommand())) {
// Get all component
java.awt.Component[] componentList = this.getComponents();
JTextField txtField;
String value;
for (int i = 0; i < componentList.length; i++) {
if (componentList[i].getClass().getName().equals("javax.swing.JTextField")) {
txtField = (JTextField) componentList[i];
value = textField.getText();
}
}
if (value != null) JOptionPane.showMessageDialog(frame, value);
}
}
});
b2.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
ButtonFrame bf=新ButtonFrame();
如果(“计算“.equals(例如getActionCommand())){
//获取所有组件
java.awt.Component[]componentList=this.getComponents();
JTextField-txtField;
字符串值;
for(int i=0;i
这太有帮助了!非常感谢您抽出时间来看这本书!不客气!祝您在这个项目和Java学习中好运@菲尼克斯:这里的关键是所有的参考资料。您需要对实际显示对象的引用,而不是任何ButtonFrame对象。理解引用和引用变量越多,就越能理解Java和OOPs。这很有意义。我把头撞在墙上想弄明白。因此,在创建3个新文本字段时,我需要引用每个显示的对象(ButtonFrame1.this--ButtonFrame2.this--ButtonFrame3.this),以便对它们进行任何操作。我试图做一个简单的摊销calculator@Phoenix字体不,我猜不是。如果您有三个JTextFields,并且它们都保存在同一个类ButtonFrame中,那么您只需要引用一个ButtonFrame对象ButtonFrame.this。然后,您将需要三个访问器方法来从三个JTextField获取文本,或者需要一个访问器方法,该方法采用一个参数,该参数以某种方式为方法键入要返回的JTextField文本。如果JTextField嵌套在其他jpanel中的jpanel中,该怎么办?如果以后GUI的布局发生变化呢?如果GUI有多个JTextFields呢?不,这是一种非常脆弱的提取信息的方法,很容易被破坏,并且不能很好地扩展。最好使用公共访问器方法。如果JTextField位于嵌套面板中,则描述了更好但更高级的方法,这将是一场噩梦。我同意你的解决方案:)我编辑了你的帖子(添加了一个空格),这样我就可以取消我的否决票了。我建议你阅读我上面评论中的链接,因为它们简直令人惊叹,让我大开眼界。他们把我的建议放在我的回答中,使我感到羞愧。
import java.awt.*;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.awt.event.ActionEvent;
public class ButtonTest {
public static void main(String[] args) {
ButtonFrame frame = new ButtonFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class ButtonFrame extends JFrame {
private JTextField loanAmt; // !! Make field private
@SuppressWarnings("LeakingThisInConstructor")
public ButtonFrame() {
setTitle("SunStream Loan Calculator v2.0");
setSize(900, 900);
ButtonPanel panel = new ButtonPanel();
panel.add(new JLabel("Enter your loan amount:"));
loanAmt = new JTextField(40);
panel.add(loanAmt);
add(panel, BorderLayout.CENTER);
}
// !! create a public method to get JTextField's text
// !! without exposing the JTextField itself.
public String getLoanAmtText() {
return loanAmt.getText();
}
class ButtonPanel extends JPanel implements ActionListener {
private Component frame;
public ButtonPanel() {
final JButton b2 = new JButton("Calculate");
add(b2, BorderLayout.SOUTH);
b2.setActionCommand("calculate");
b2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// !! ButtonFrame bf = new ButtonFrame();
if ("calculate".equals(e.getActionCommand())) {
//!! call public method on ButtonFrame object
JOptionPane.showMessageDialog(frame,
ButtonFrame.this.getLoanAmtText());
}
}
});
}
@Override
public void actionPerformed(ActionEvent ae) {
throw new UnsupportedOperationException("Not supported yet.");
}
}
}
b2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ButtonFrame bf = new ButtonFrame();
if("calculate".equals(e.getActionCommand())) {
// Get all component
java.awt.Component[] componentList = this.getComponents();
JTextField txtField;
String value;
for (int i = 0; i < componentList.length; i++) {
if (componentList[i].getClass().getName().equals("javax.swing.JTextField")) {
txtField = (JTextField) componentList[i];
value = textField.getText();
}
}
if (value != null) JOptionPane.showMessageDialog(frame, value);
}
}
});