Как заставить JButtons печатать целые числа в JTextField, используя Action Listener и Action Event?
Я пытаюсь создать и гипотетический интерфейс 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
3 ответа
В следующем коде я получил кнопку прослушивания, чтобы ответить и вывести текст нажатой кнопки для отображения в текстовом поле. Все изменения документируются, начиная с / ****, чтобы объяснить, что я сделал.
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package logging;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
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);
/**** what is the purpose of this JButton ? */
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);
/**** The action listener should go on the button which is pressed
see createBtnPanel */
// BtnListener listener = new BtnListener();
// jbtOne.addActionListener(listener);
/**** what is the purpose of this JPasswordField ?
it is not being added to any JPanel */
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));
/**** create the listener */
BtnListener listener = new BtnListener();
for (String[] text : texts) {
for (String element : text) {
JButton btn = new JButton(element);
btn.setFont(BTN_FONT);
/**** add the listener to each button*/
btn.addActionListener(listener);
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 */
/**** what is the purpose of it ? int int1=0; */
/**** the event is generated by the button created in
createBtnPanel so e.getSource() can not be equal to
jbtOne. It should be an instance of JButton */
if(e.getSource() instanceof JButton)
{
/**** get the JButton clicked */
JButton button = (JButton) e.getSource() ;
/**** display its text on the text field */
jtfNumber1.setText(button.getText());
}
}
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
/**** new MultiplePanels(); is un defined */
new TerminalATM();
}
});
}
}//EndTerminalATM
Мне нужно лучше понять, какой функциональности вы хотите достичь с помощью поля пароля и прослушивателя действий, поэтому я могу попытаться помочь вам в дальнейшем, если это необходимо. (0:
Мне кажется, что вы не добавляете jbtOne
на видимую панель. Ваш createBtnPanel
Метод создает свои собственные кнопки и добавляет их на панель без каких-либо действий слушателей.
Попробуйте изменить следующие строки внутреннего цикла createBtnPanel
:
for (int row = 0; row < texts.length; row++) {
for (int col = 0; col < texts[row].length; col++) {
final String text = texts[row][col];
final JButton btn = new JButton(text);
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
passwordField.setText(text);
}
});
btn.setFont(BTN_FONT);
btnPanel.add(btn);
}
}
Дайте мне знать, если вы не понимаете, что это делает, или у вас есть какие-либо проблемы с этим.
Этот код также может быть значительно упрощен, если вы используете Java 8, но я полагаю, что вы не будете прямо отвечать на мой ответ.
Ваши слушатели используют passwordField, однако кажется, что вы добавили текстовое поле на панель, либо используйте passwordField или jtfNumber1.