KeyListener. Не работает ввод с клавиатуры - Java

Узнай цену своей работы

Формулировка задачи:

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.KeyEventDispatcher;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
 
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
 
import com.sun.xml.internal.ws.api.Component;
 
public class C1 extends JFrame {
 
    JButton b0 = new JButton("0");
    JButton b1 = new JButton("1");
    JButton b2 = new JButton("2");
    JButton b3 = new JButton("3");
    JButton b4 = new JButton("4");
    JButton b5 = new JButton("5");
    JButton b6 = new JButton("6");
    JButton b7 = new JButton("7");
    JButton b8 = new JButton("8");
    JButton b9 = new JButton("9");
    JButton b10 = new JButton("+");
    JButton b11 = new JButton("-");
    JButton b12 = new JButton("*");
    JButton b13 = new JButton("/");
    JButton b14 = new JButton("=");
    JButton b15 = new JButton("CE");
    JButton b16 = new JButton("<-");
    JButton b17 = new JButton("CLOSE");
 
    JTextField t = new JTextField();
    boolean bb;

    public C1(String name) {
        super("Калькулятор");
        setLayout(null);
        setSize(300, 400);
        t.setBounds(10, 10, 260, 50);
        t.setEditable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setVisible(true);
 
        b0.setBounds(60, 220, 50, 50);
        b0.setBackground(Color.BLUE);
        b1.setBounds(10, 70, 50, 50);
        b2.setBounds(60, 70, 50, 50);
        b3.setBounds(110, 70, 50, 50);
        b4.setBounds(10, 120, 50, 50);
        b5.setBounds(60, 120, 50, 50);
        b6.setBounds(110, 120, 50, 50);
        b7.setBounds(10, 170, 50, 50);
        b8.setBounds(60, 170, 50, 50);
        b9.setBounds(110, 170, 50, 50);
        b10.setBounds(10, 220, 50, 50);
        b10.setBackground(Color.CYAN);
        b11.setBounds(110, 220, 50, 50);
 
        b12.setBounds(160, 70, 50, 50);
        b13.setBounds(160, 120, 50, 50);
        b14.setBounds(160, 170, 50, 50);
        b15.setBounds(160, 220, 50, 50);
        b16.setBounds(210, 70, 60, 200);
        b17.setBounds(10, 270, 100, 70);
        add(b0);
        add(b1);
        add(b2);
        add(b3);
        add(b4);
        add(b5);
        add(b6);
        add(b7);
        add(b8);
        add(b9);
        add(b10);
        add(b11);
        add(b12);
        add(b13);
        add(b14);
        add(b15);
        add(b16);
        add(b17);
        add(t);
        
        b17.addActionListener(new ActionListener() {
 
            @Override
            public void actionPerformed(ActionEvent e) {
 
                System.exit(0);
            }
        });
        
    b0.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_NUMPAD0) {
                t.setText(t.getText() + "0");
 
            }
        }
 
    });
    
    }
}
            
Так же мне надо создать возможность попеременного ввода с клавиатуры и по нажатию JButton
вот пример кода:
 
        b2.addActionListener(new ActionListener() {
 
            @Override
            public void actionPerformed(ActionEvent e) {
                t.setText(t.getText() + "2");
 
            }
 
        });
        b2.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_NUMPAD2) {
                    t.setText(t.getText() + "2");
                }
            }
        });
KeyListener работает только после нажатия JButton с соответствующей цифрой. Надо сделать через Runnable. Я не знаю как. Прошу совета.

Решение задачи: «KeyListener. Не работает ввод с клавиатуры»

textual
Листинг программы
import org.w3c.dom.events.Event;
 
import java.awt.Color;
import java.awt.event.*;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import javax.swing.*;
 
public class C1 extends JFrame implements Runnable {
    JPanel panel = new JPanel();
    JButton b[] = new JButton[18]; // Массив кнопок от [0]-[9] будут цифры, остальное - другие функции
    JTextField t = new JTextField();
 
    public static void main(String[] args){
        C1 c = new C1();
        c.run();
    }
 
    @Override
    public void run() {
        setTitle("Калькулятор");
        panel.setLayout(null);
        setSize(300, 400);
        t.setBounds(10, 10, 260, 50);
        t.setEditable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        for(int i = 0; i < b.length; i++){
            if(i<10) {
                b[i] = new JButton(String.valueOf(i)); // Инициализируем кнопки и добавляем текст
                actionNumb(b[i]); // Для клавиш от 0 к 9
            }
            else
                b[i] = new JButton();
        }
 
        b[10] = new JButton("+");
        b[11] = new JButton("-");
        b[12] = new JButton("*");
        b[13] = new JButton("/");
        b[14] = new JButton("=");
        b[15] = new JButton("CE");
        b[16] = new JButton("<-");
        b[17] = new JButton("CLOSE");
 
 
        b[0].setBounds(60, 220, 50, 50);
        b[0].setBackground(Color.BLUE);
        b[1].setBounds(10, 70, 50, 50);
        b[2].setBounds(60, 70, 50, 50);
        b[3].setBounds(110, 70, 50, 50);
        b[4].setBounds(10, 120, 50, 50);
        b[5].setBounds(60, 120, 50, 50);
        b[6].setBounds(110, 120, 50, 50);
        b[7].setBounds(10, 170, 50, 50);
        b[8].setBounds(60, 170, 50, 50);
        b[9].setBounds(110, 170, 50, 50);
        b[10].setBounds(10, 220, 50, 50);
        b[10].setBackground(Color.CYAN);
        b[11].setBounds(110, 220, 50, 50);
        b[12].setBounds(160, 70, 50, 50);
        b[13].setBounds(160, 120, 50, 50);
        b[14].setBounds(160, 170, 50, 50);
        b[15].setBounds(160, 220, 50, 50);
        b[16].setBounds(210, 70, 60, 200);
        b[17].setBounds(10, 270, 100, 70);
 
        for(int i = 0; i < b.length; i++) {
            b[i].setFocusable(false); // Что-бы не было проблем с фокусом
        }
 
        action(); // Добавляем слушателя и прочее для всего остального
 
        for(int i = 0; i < b.length; i++){
            panel.add(b[i]);
        }
        panel.add(t);
 
        panel.setBackground(Color.WHITE);
        this.add(panel);
        setVisible(true);
    }
 
    public void actionNumb(JButton butt){ // Для чисел от 0 к 9
        butt.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                t.setText(t.getText() + butt.getText());
            }
        });
    }
 
    public void action() {
        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) { // Если мышь весит на JFrame
                requestFocusInWindow(); // тогда фокус всеравно будет на форме для Нумпада
            }
 
            @Override
            public void mouseExited(MouseEvent e) { // И если выйдет с формы на любой другой компонент
                requestFocusInWindow();
            }
        });
 
        this.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                for(int i = 0; i < 9; i++) {
                    if (e.getKeyCode() == 96 + i) { // от 96 к 105 - Номер кнопок на нумпаде от 0 к 9
                        t.setText(t.getText() + i);
                    }
                }
            }
        });
 
        b[17].addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
 
        b[16].addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) { // Для <-
                String str = t.getText();
                String newStr = "";
                char[] chrStr = str.toCharArray();
 
                for(int i = 0; i < chrStr.length - 1; i++){
                    newStr += chrStr[i];
                }
                t.setText(newStr);
            }
        });
 
        b[14].addActionListener(new ActionListener() { // Это для = , пиши любое уровнение с множеством + - *... , оно все решит :)
            @Override
            public void actionPerformed(ActionEvent e) {
                ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
                String expression = t.getText();
 
                float result = 0;
                try {
                    result = Float.valueOf(engine.eval(expression).toString());
                    t.setText(String.valueOf(result));
                } catch (ScriptException e1) {
                    e1.printStackTrace();
                }
            }
        });
 
        b[10].addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                t.setText(t.getText() + " + ");
            }
        });
 
        //   Для -, *, /, CE сам допишешь
 
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.692 из 5