Как сделать простую клавиатуру на Java для эффективного ввода в JTextFields?
Я работаю над клавиатурой на Java, которая будет использоваться для ввода данных в два JTextField (x & y). И как только пользователь нажимает "Enter", он должен оценить разницу х и у. Нужно ли добавлять кучу actionListeners для каждой кнопки? Есть ли эффективный способ сделать это.
Что касается моего кода, у меня есть все нужные мне кнопки, но вместо того, чтобы использовать клавиатуру, я хочу использовать виртуальную клавиатуру вместо ввода цифр (технически, String). Какие-либо предложения?
import javax.swing.*;
import java.awt.*;
public class EmbeddedMain extends JFrame
{
public static void main (String[] args)
{
EmbeddedMain em = new EmbeddedMain();
}
public EmbeddedMain()
{
setTitle("testing");
setSize(450,350);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setLayout(new GridLayout(4,5,3,3));
JButton button1= new JButton("7");
JButton button2= new JButton("8");
JButton button3= new JButton("9");
JButton button4= new JButton("4");
JButton button5= new JButton("5");
JButton button6= new JButton("6");
JButton button7= new JButton("1");
JButton button8= new JButton("2");
JButton button9= new JButton("3");
JButton button0= new JButton("0");
JButton buttonR= new JButton("Reset");
JButton buttonE= new JButton("Enter");
JTextField x = new JTextField(" ");
JTextField y = new JTextField(" ");
JTextField CPP_entry = new JTextField(" ");
CPP_entry.setEditable(false);
add(button1);
add(button2);
add(button3);
add(new JLabel(" x:"));
add(x);
add(button4);
add(button5);
add(button6);
add(new JLabel(" y:"));
add(y);
add(button7);
add(button8);
add(button9);
add(new JLabel(" x-y:"));
add(CPP_entry);
add(buttonR);
add(button0);
add(buttonE);
setVisible(true);
}
}
3 ответа
Две вещи:
сначала вы можете использовать только один ActionListener
Просто позаботьтесь о том, чтобы добавить его ко всем кнопкам, и тогда вы сможете сделать что-то вроде:
public void actionPerformed(ActionEvent e)
{
JButton currentButton = (JButton)e.getSource();
int number = currentButton.getText().charAt(0) - '0';
// do whatever with the number
}
во-вторых, вы можете использовать KeyListener
чтобы поймать нажатия клавиш, когда ваша клавиатура сфокусирована, у слушателя есть три метода: keyPressed(KeyEvent e)
, keyReleased(KeyEvent e)
а также keyTyped(KeyEvent e)
, Взгляните на урок оракула здесь, чтобы узнать, как их использовать.
Я бы сделал массив кнопок вроде этого:
JButton[] buttonArray = new JButton[10];
for(int i = 0; i < buttonArray.length; i++ ) {
buttonArray[i] = new JButton(String.valueOf(i));
buttonArray[i].addActionListener(yourActionListener);
}
а затем при возникновении события проверьте его происхождение.
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class EmbeddedMain extends JFrame implements ActionListener
{
private JTextField[] tfld = new JTextField[4];// x,y,z;
private String sigma = " "+(char)0x2211;
private String[] str = {"X=","Y=","Z=",sigma+"="};
private String[] txt = {
"7", "8", "9",
"4", "5", "6",
"1", "2", "3",
"Reset", "0", "Enter"};
private JButton[] but = new JButton[12];
public static void main (String[] args)
{
EmbeddedMain em = new EmbeddedMain();
}
public EmbeddedMain() //constructor begins, method for embedded main class
{
setTitle("Subtraction");
setSize(420,350);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setLayout(new FlowLayout());
JPanel copa = (JPanel)getContentPane();
copa.setPreferredSize(dim(3*70+140+5*5, 4*70+5*5));
copa.setBackground(new Color(100,255,100));
for (int i = 0, j = 0, k = 1; i < but.length; i++, k++) {
but[i] = new JButton(txt[i]);
but[i].setPreferredSize(dim(70,70));
but[i].setFont(new Font("default",0,18));
but[i].setMargin(new Insets(0,0,0,0));
but[i].addActionListener(this);
but[i].setName(""+i);
add(but[i]);
if (k%3 == 0) {
tfld[j] = new JTextField(str[j]);
tfld[j].setPreferredSize(dim(140,70));
add(tfld[j++]);
}
}
pack();
setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
Object src = e.getSource();
if (src instanceof JButton) {
JButton but = (JButton)src;
String nm = but.getName();
int nr = Integer.parseInt(nm)/3;
String txt = but.getText();
if (txt.equalsIgnoreCase("reset")) {
for (int j = 0; j < tfld.length; j++)
tfld[j].setText(str[j]);
}
else if (txt.equalsIgnoreCase("enter")) {
}
else
tfld[0].setText(tfld[0].getText() + txt);
}
}
public Dimension dim(int w, int h) {
return new Dimension(w,h);
}
}