Как динамически изменять и связывать текстовые поля в Java Swings?

Я только начал изучать Java Swings. На самом деле я планирую сделать конвертер валют, в котором есть 3 текстовых поля: доллар, рупия и иена. Когда я редактирую текстовое поле доллара, я хотел, чтобы два других текстовых поля динамически изменялись на соответствующее значение конвертированной валюты. Вначале я пробовал использовать DocumentListener, но у меня ничего не вышло. Итак, я попробовал addKeyListener. Когда я меняю первое текстовое поле, оно работает отлично, но когда я сначала меняю второе или третье поле, я получаю события насоса и ошибки потоков, с которыми я не знаком. Пожалуйста, посмотрите код здесь. Заранее спасибо.

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import net.miginfocom.swing.MigLayout;
import javax.swing.JTextField;
import java.awt.GridBagLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.GridBagConstraints;
import javax.swing.JLabel;

public class Conv {

private JFrame frame;
private JTextField textField1;
private JTextField textField2;
private JTextField textField3;
private JLabel lblNum;
private JLabel lblNum_1;
private JLabel lblNum_2;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Conv window = new Conv();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public Conv() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 450, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);

    textField1 = new JTextField();
    textField1.setBounds(170, 69, 86, 20);
    frame.getContentPane().add(textField1);
    textField1.setColumns(10);

    textField2 = new JTextField();
    textField2.setBounds(170, 111, 86, 20);
    frame.getContentPane().add(textField2);
    textField2.setColumns(10);

    textField3 = new JTextField();
    textField3.setBounds(170, 155, 86, 20);
    frame.getContentPane().add(textField3);
    textField3.setColumns(10);

    lblNum = new JLabel("Dollar");
    lblNum.setBounds(114, 72, 46, 14);
    frame.getContentPane().add(lblNum);

    lblNum_1 = new JLabel("Rupees");
    lblNum_1.setBounds(114, 114, 46, 14);
    frame.getContentPane().add(lblNum_1);

    lblNum_2 = new JLabel("Yen");
    lblNum_2.setBounds(114, 158, 46, 14);
    frame.getContentPane().add(lblNum_2);
    textField1.addKeyListener(new KeyAdapter() {
          public void keyReleased(KeyEvent e1) {    
            textField2.setText("");
            textField3.setText("");  
            Double d1,d2,d3;
            d1 = Double.parseDouble(textField1.getText());
            d2 = d1 + 1;
            d3 = d1 + 2;
            textField2.setText(Double.toString(d2));
            textField3.setText(Double.toString(d3));
          }

        });
    textField2.addKeyListener(new KeyAdapter() {
          public void keyTyped(KeyEvent e2) {
              textField1.setText("");
                textField3.setText("");  
                Double d1,d2,d3;
                d2 = Double.parseDouble(textField2.getText());
                d1 = d2 - 1;
                d3 = d2 + 1;
                textField1.setText(Double.toString(d1));
                textField3.setText(Double.toString(d3));
          }

        });
    textField3.addKeyListener(new KeyAdapter() {


          public void keyPressed(KeyEvent e3) {
              textField1.setText("");
                textField2.setText("");  
                Double d1,d2,d3;
                d3 = Double.parseDouble(textField3.getText());
                d1 = d3 - 2;
                d2 = d3 - 1;
                textField1.setText(Double.toString(d1));
                textField2.setText(Double.toString(d2));
          }
        });
      }

}

Вывод / ошибки:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException:empty String
at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
at sun.misc.FloatingDecimal.parseDouble(Unknown Source)
at java.lang.Double.parseDouble(Unknown Source)
at Conv$3.keyTyped(Conv.java:101)
at java.awt.Component.processKeyEvent(Unknown Source)
at javax.swing.JComponent.processKeyEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

пожалуйста, также добавьте полученное сообщение об ошибке полный / Stacktrace.

Timothy Truckle 26.03.2018 17:40

Я добавил ошибки.

Tejas Naresh Suvarna 26.03.2018 17:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Первая строка вашего сообщения об ошибке содержит: java.lang.NumberFormatException:empty String Это означает, что вы пытаетесь преобразовать пустую строку "" в число, полученное из незаполненного текстового поля.


первая строка в трассировке стека, в которой упоминается ваш код:

at Conv$3.keyTyped(Conv.java:101)

Я предполагаю, что это здесь:

   textField2.addKeyListener(new KeyAdapter() {
          public void keyTyped(KeyEvent e2) {
              textField1.setText("");
                textField3.setText("");  
                Double d1,d2,d3;
                d2 = Double.parseDouble(textField2.getText()); // line 101

вам нужно извлечь textField2.getText() в локальная переменная и проверить, действительно ли он содержит число.

Я закомментировал: "textField2.setText (" 0 ");". Но это все равно не работает

Tejas Naresh Suvarna 26.03.2018 17:58

Тимоти Тракл, пожалуйста, помогите мне в этом.

Tejas Naresh Suvarna 26.03.2018 18:29

Другие вопросы по теме