2014-11-15 2 views
0

Мой класс, который распространяется на JDialog, не вернет значение после щелчка в порядке. Может ли кто-нибудь показать, что я делаю неправильно? Я хочу, чтобы он возвращал значение, которое является двойным.Никакое значение не возвращается на JDialog после нажатия кнопки ok

Вот мой код:

import javax.swing.*; 
import javax.swing.border.*; 
import java.awt.*; 
import java.awt.BorderLayout; 
import java.awt.event.*; 

public class DepositWindow extends JDialog 
{ 
    private JButton jbtOk; 
    private JButton jbtCancel; 
    private JLabel jlbAccountNumber; 
    private JTextField jtfAmount; 

    public DepositWindow() { 
     setModal(true); 
     // Create panel p1 for the buttons and set GridLayout 
     // Set BorderLayout with horizontal gap 5 and vertical gap 10 
     setLayout(new BorderLayout(5, 10)); 
     JPanel p1 = new JPanel(); 
     p1.setBorder(new TitledBorder("Actions")); 
     p1.setLayout(new FlowLayout(FlowLayout.RIGHT, 1, 1)); 
     jbtOk = new JButton("OK"); 
     jbtCancel = new JButton("Cancel"); 
     p1.add(jbtOk); 
     p1.add(jbtCancel); 

     this.add(p1,BorderLayout.SOUTH); 

     JPanel p2 = new JPanel(new GridLayout(2,2)); 
     p2.setBorder(new TitledBorder("Account")); 
     p2.add(new JLabel("Account Number")); 
     jlbAccountNumber = new JLabel("*****-56"); 
     p2.add(jlbAccountNumber); 
     p2.add(new JLabel("Amount")); 
     jtfAmount = new JTextField(10); 
     p2.add(jtfAmount); 

     // add contents into the frame 
     add(p2, BorderLayout.CENTER); 

     jbtOk.addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent e){ 
       setVisible(false); 
      } 
     }); 
    } 

    public double getAmount(){ 
     return Double.parseDouble(jtfAmount.getText()); 
    } 

    /** Main method */ 
    public static void main(String[] args) { 
    DepositWindow frame = new DepositWindow(); 
    frame.setTitle("Deposit Window"); 
    frame.pack(); 
    frame.setLocationRelativeTo(null); // Center the frame 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
    double amount = frame.getAmount(); 
    } 
} 

Это дает мне эти ошибки, когда я запускаю мою основную Ошибку:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: empty String 
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1011) 
    at java.lang.Double.parseDouble(Double.java:540) 
    at DepositWindow.getAmount(DepositWindow.java:51) 
    at AccountWindow.<init>(AccountWindow.java:48) 
    at LoginWindow.login(LoginWindow.java:67) 
    at LoginWindow.access$000(LoginWindow.java:16) 
    at LoginWindow$1.actionPerformed(LoginWindow.java:55) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
    at java.awt.Component.processMouseEvent(Component.java:6505) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3320) 
    at java.awt.Component.processEvent(Component.java:6270) 
    at java.awt.Container.processEvent(Container.java:2229) 
    at java.awt.Component.dispatchEventImpl(Component.java:4861) 
    at java.awt.Container.dispatchEventImpl(Container.java:2287) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
    at java.awt.Container.dispatchEventImpl(Container.java:2273) 
    at java.awt.Window.dispatchEventImpl(Window.java:2719) 
    at java.awt.Component.dispatchEvent(Component.java:4687) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735) 
    at java.awt.EventQueue.access$200(EventQueue.java:103) 
    at java.awt.EventQueue$3.run(EventQueue.java:694) 
    at java.awt.EventQueue$3.run(EventQueue.java:692) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
    at java.awt.EventQueue$4.run(EventQueue.java:708) 
    at java.awt.EventQueue$4.run(EventQueue.java:706) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 
+1

Ну, вы что-то ввели в текстовое поле? Кажется, нет. Прекрасно работает после удаления 'frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);' –

+0

@JBNizet отлично работает, когда я заменяю Dispose, его следует заменить на dispose else, когда программа будет запускаться в фоновом режиме при закрытии, если вы только удалите его. см. мой ответ здесь http://stackoverflow.com/a/26944883/1966247 – Muhammad

ответ

0

Вашей трассировка стека говорит, что это все - вы получаете NumberFormatException при попытке разобрать строку в двойной - Double.parseDouble(jtfAmount.getText()).

Javadoc говорит:

Throws:
NullPointerException - if the string is null
NumberFormatException - if the string does not contain a parsable double.

Так использовать try/catch блок для обработки таких случаев.

Кроме того, вы можете провести некоторую проверку в своем диалоговом окне, если вы не хотите ждать, пока диалоговое окно не будет закрыто, чтобы узнать, нормально ли введенное значение.

0

Фактическая проблема заключается не в формате числа, а при закрытии операции, замените инструкцию DefaultCloseOperation следующим образом, чтобы она работала для меня. так как это JDialog, он должен быть удален :)

frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
Смежные вопросы