java如何使用Action Listener和Action Event让JButtons打印JTextField中的整数?
我试图创建一个虚拟的ATM GUI界面,通过键盘输入几个数字。我在让程序在用户单击任何按钮后显示数字时遇到问题。为了节省时间,我只创建了一个按钮:
public JButton jbtOne = new JButton(STANDARD_BTN_TEXTS[0][0]);
因此,如果用户单击“jbtOne”,请说4次。JTextField应显示1111。我的问题是按钮对代码行没有响应:
addActionListener(listener)
如何让JButtons在JTextField中打印整数?我以前已经让它工作过,但是在使用这行代码添加了一个更加用户友好的外观之后,它又无法工作了:
private static final String[][] STANDARD_BTN_TEXTS =
{
{"1", "2", "3"},
{"4", "5", "6"},
{"7", "8", "9"},
{ "0" }
有人能给我指出正确的方向吗?任何帮助都将不胜感激
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JFrame;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractButton;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JPasswordField;
public class TerminalATM extends JFrame
{
private JPanel panel;
public final JPasswordField passwordField = new JPasswordField(2);
private static final String[][] STANDARD_BTN_TEXTS =
{
{"1", "2", "3"},
{"4", "5", "6"},
{"7", "8", "9"},
{ "0" }
};
private static final int GAP = 5;
private static final Font BTN_FONT = new Font(Font.DIALOG, Font.BOLD, 20);
public JButton jbtOne = new JButton(STANDARD_BTN_TEXTS[0][0]);
private JTextField jtfNumber1 = new JTextField(8);//Define Number Field
public TerminalATM()
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
JPanel standardPanel = createBtnPanel(STANDARD_BTN_TEXTS, "KeyPad");
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(0, 1));
buttonPanel.add(jtfNumber1, BorderLayout.NORTH);
buttonPanel.add(standardPanel, BorderLayout.SOUTH);
BtnListener listener = new BtnListener();
jbtOne.addActionListener(listener);
TextFieldHandler handler = new TextFieldHandler();
passwordField.addActionListener(handler);
add(buttonPanel, BorderLayout.LINE_START);
setSize(450, 500);
setVisible(true);
}
//Create Unique Rows of Buttons
private JPanel createBtnPanel(String[][] texts, String title) {
JPanel btnPanel = new JPanel();
int rows = texts.length;
int cols = texts[0].length;
btnPanel.setLayout(new GridLayout(rows, cols, GAP, GAP));
for (int row = 0; row < texts.length; row++) {
for (int col = 0; col < texts[row].length; col++) {
JButton btn = new JButton(texts[row][col]);
btn.setFont(BTN_FONT);
btnPanel.add(btn);
}
}
btnPanel.setBorder(BorderFactory.createTitledBorder(title));
return btnPanel;
}
private class TextFieldHandler implements ActionListener
{
@Override
public void actionPerformed(ActionEvent event)
{
String string = "";
if(event.getSource()==passwordField)
string = String.format("textField1: %s", event.getActionCommand());
}
}
/**** Create Button Listener and Action Listener ****/
class BtnListener implements ActionListener
{
@Override
public void actionPerformed(ActionEvent e)
{
/* This is where we would set each button to the action event */
/* Only Button one for brevity */
int int1=0;
if(e.getSource().equals(jbtOne))
{
int1 = 1;
passwordField.setText(String.valueOf(int1));
}
}
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new TerminalATM();
}
});
}
}//EndTerminalATM
# 1 楼答案
在我看来,您没有将
jbtOne
添加到可见面板。您的createBtnPanel
方法创建自己的按钮,并将它们添加到面板中,而不使用任何操作侦听器尝试更改
createBtnPanel
的内部循环的以下行:如果你不明白这是怎么回事或者有什么问题,请告诉我
如果您使用的是Java8,那么这段代码也可以大大简化,但我假设您不想让我的答案直截了当
# 2 楼答案
您的侦听器正在使用passwordField,但您似乎已将文本字段添加到面板中,请使用passwordField或jtfNumber1
# 3 楼答案
在下面的代码中,我让按钮侦听器响应并输出单击按钮的文本以显示在文本字段中。 所有更改都以/******开始记录,以解释我所做的操作
我需要更好地了解您希望通过密码字段和操作侦听器实现的功能,以便在需要时可以尝试进一步帮助您。(0: