Я только начал изучать 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)
Я добавил ошибки.




Первая строка вашего сообщения об ошибке содержит: 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 ");". Но это все равно не работает
Тимоти Тракл, пожалуйста, помогите мне в этом.
пожалуйста, также добавьте полученное сообщение об ошибке полный / Stacktrace.