2013-06-02 2 views
-1

Я написал калькулятор в NetBeans и отлично работает. Тем не менее, я должен на самом деле нажать кнопки, чтобы вставлять числа, и я пытаюсь исправить это с помощью KeyListener. У меня есть все мои номера и функциональные кнопки, установленные внутри кнопок JPanel с именем. У меня есть ярлык на дисплее JPanel с именем.Использование KeyListener для калькулятора в NetBeans

Я установил свой класс для реализации KeyListener и вставил методы KeyPressed, -Typed и -Released; однако я застрял оттуда. Я не уверен, как заставить мои кнопки прослушивать событие KeyPressed, и когда он слышит событие - активирует кнопку. Кроме того, мои кнопки называются их номером (например, кнопка «Нуль» имеет нулевое значение, одна кнопка - одна и т. Д.).

Я прочитал, что вам действительно нужно реализовать KeyListener где-то, используя: something.addKeyListener (что-то); , но я не могу понять это.

Могу ли я получить помощь здесь? Я новичок в Java, и это мой первый сольный проект. И дайте мне знать, если я не предоставил достаточную информацию.

EDIT: Большая часть моего кода является NetBeans Generated, и я не могу редактировать инициализацию компонентов, которые, кажется, являются моей проблемой, я думаю?

Мой класс декларации:

public class Calculator extends javax.swing.JFrame implements KeyListener { 
//Creates new form Calculator 
public Calculator() { 
    initComponents(); 
} 

Один из моих buttonPressed действий (все одинаковые с изменениями для фактического числа):

private void zeroActionPerformed(java.awt.event.ActionEvent evt) {          
    if (display.getText().length() >= 16) 
    { 
     JOptionPane.showMessageDialog(null, "Cannot Handle > 16 digits"); 
     return; 
    } 
    else if (display.getText().equals("0")) 
    { 
     return; 
    } 
    display.setText(display.getText().concat("0")); 

Основной метод поставляется NetBeans:

public static void main(String args[]) { 
    /* Create and display the form */ 
    java.awt.EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new Calculator().setVisible(true); 
     } 
    }); 
} 

Созданный netComponents() netbeans абсолютно массивный (около 500 строк кода), и я Не редактируйте ни одно из них. Сообщите мне, могу ли я предоставить более полезную информацию.

+0

Можете ли вы разместить свой код? –

+0

Проработали ли вы какие-либо учебники? Вот один из них: http://docs.oracle.com/javase/tutorial/uiswing/events/keylistener.html –

+0

Я разместил код. И я последовал за 4 различными учебниками, включая тот, который вы указали. Кажется, я не понимаю. Они создают новый KeyListener на JComponent, но я не могу этого сделать. – Nick

ответ

1

Я не уверен, что полностью понимаю ваш вопрос, и какой-то код поможет, но я взломаю, так как это звучит как проблема, с которой у меня было много.

Похоже, причина, по которой ваши нажатия клавиш не распознаются, заключается в том, что фокус находится на одной из кнопок. Если вы добавите keylisteners к кнопкам, тогда у вас не должно возникнуть никаких проблем. В netbeans вы можете легко добавить клавишников в дизайн-экран. Вот фотография, показывающая вам, как добавить keyPressed listener к кнопке в jPanel.

enter image description here

private void jButton1KeyPressed(java.awt.event.KeyEvent evt) {          
    //Check which key is pressed 
    //do whatever you need to do with the keypressed information 
}  

Это хорошо, чтобы иметь возможность выписывать слушателей самостоятельно, но если вы только учитесь, то это также хорошо, чтобы получить как можно больше помощи, как это возможно. Это может быть не лучшее решение, так как вам нужно будет добавить слушателя для каждой из ваших кнопок.

+0

Хорошо, я реализовал это и попытался просто получить KeyCode для печати в Консоль, чтобы проверить, работает ли он, однако это не так. System.out.println ("Код:" evt.getKeyCode()); Может быть проблема Focus, и если да, то как я могу решить проблему? – Nick

+0

Я не совсем уверен, хотя в коде, который вы только что написали, отсутствует знак «+». – Move127

+0

Хорошо, я продвигаюсь вперед. Когда я запускаю приложение, я заметил, что мой ключ 7 имеет синюю рамку, и я решил, что это означает, что это было сфокусировано - действительно, так оно и было. Но если это единственная кнопка с фокусом, это единственная кнопка, которая сможет обнаружить keyPressed, и если я нажму другую клавишу, фокус сдвинется. Так что было бы хорошо сосредоточиться на контейнере, верно? И если да, то как я могу это сделать? – Nick

4

Может быть проблема Focus, и если да, то как я могу решить проблему?

Да, возможно, проблема сфокусирована. Вот почему вы НЕ должны использовать KeyListener.

Свинг предназначен для использования с ключевыми связями.То есть вы создаете действие, которое делает то, что вы хотите. Затем это действие можно добавить в JButton. Он также может быть связан с KeyStroke. Таким образом, у вас есть хороший код многократного использования.

Для получения дополнительной информации ознакомьтесь с руководством по качанию How to Use Key Bindings. Ключевые привязки не имеют проблемы с фокусом, которые у вас есть в настоящее время.

+1

Лошадь + вода: P – MadProgrammer

 Смежные вопросы

  • Нет связанных вопросов^_^