Как получить пользовательский ввод из JTextField? - PullRequest
3 голосов
/ 23 октября 2011

Я пытаюсь очень простая форма, предназначенная для ввода пользовательского ввода в JTextField и показа того же ввода через всплывающее диалоговое окно.

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

Однако, когда я оставляю поле пустым и пытаюсь использовать getText () для отображения текста во всплывающем диалоговом окне, я либо получаю пустую всплывающую рамку, либо получаю исключение «пустая строка» (я пытаюсь разобрать String to Double.)

</p>

<code>package buttontest;

import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import javax.swing.*;
import java.awt.event.ActionEvent;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;



public class ButtonTest
{
    public static void main(String[] args)
    {
        ButtonFrame frame = new ButtonFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}
class ButtonFrame extends JFrame
{
    @SuppressWarnings("LeakingThisInConstructor")
    public ButtonFrame()
    {


                setTitle("SunStream Loan Calculator v2.0");
        setSize(900,900);
        ButtonPanel panel = new ButtonPanel();
        panel.add(new JLabel("Enter your loan amount:"));
                loanAmt = new JTextField(40);
                panel.add(loanAmt);

                add(panel,BorderLayout.CENTER);
    }


        public JTextField loanAmt;

class ButtonPanel extends JPanel implements ActionListener
{
    private Component frame;
    public ButtonPanel()
    {

                final JButton b2 = new JButton("Calculate");
        add(b2, BorderLayout.SOUTH);
                b2.setActionCommand("calculate");
                b2.addActionListener(new ActionListener(){
                    public void actionPerformed(ActionEvent e)
                        {
                              ButtonFrame bf = new ButtonFrame();
                              if("calculate".equals(e.getActionCommand()))
                                {
                                     JOptionPane.showMessageDialog(frame, bf.loanAmt.getText());
                                }
                        }

    });

        }

        @Override
        public void actionPerformed(ActionEvent ae) {
            throw new UnsupportedOperationException("Not supported yet.");
        }


  }
}
</code>

Любая помощь будет принята с благодарностью. Я исследую использование KeyListener или KeyEvent, но я не совсем понимаю это достаточно хорошо.

Ответы [ 2 ]

8 голосов
/ 23 октября 2011

Вы создаете «теневую» переменную ButtonFrame внутри ActionListener b2.Да, переменная bf ссылается на объект ButtonFrame, который принадлежит к тому же классу, что и отображаемый объект ButtonFrame, но относится к совершенно отличному и невизуализированному объекту.Ключом к решению является получение текста из объекта ButtonFrame, который фактически отображается, и его можно получить из внутреннего класса с помощью конструкции ButtonFrame.this:

     b2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
           //!! ButtonFrame bf = new ButtonFrame();
           if ("calculate".equals(e.getActionCommand())) {

              //!! note use of ButtonFrame.this:
              JOptionPane.showMessageDialog(frame, ButtonFrame.this.loanAmt.getText());
           }
        }

     });

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

Например (изменения обозначены // !! comment):

import java.awt.*;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.awt.event.ActionEvent;

public class ButtonTest {
   public static void main(String[] args) {
      ButtonFrame frame = new ButtonFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
   }
}

class ButtonFrame extends JFrame {

   private JTextField loanAmt; // !! Make field private

   @SuppressWarnings("LeakingThisInConstructor")
   public ButtonFrame() {

      setTitle("SunStream Loan Calculator v2.0");
      setSize(900, 900);
      ButtonPanel panel = new ButtonPanel();
      panel.add(new JLabel("Enter your loan amount:"));
      loanAmt = new JTextField(40);
      panel.add(loanAmt);

      add(panel, BorderLayout.CENTER);
   }

   // !! create a public method to get JTextField's text
   // !! without exposing the JTextField itself.
   public String getLoanAmtText() {
      return loanAmt.getText();
   }

   class ButtonPanel extends JPanel implements ActionListener {
      private Component frame;

      public ButtonPanel() {

         final JButton b2 = new JButton("Calculate");
         add(b2, BorderLayout.SOUTH);
         b2.setActionCommand("calculate");
         b2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
               // !! ButtonFrame bf = new ButtonFrame();
               if ("calculate".equals(e.getActionCommand())) {

                  //!! call public method on ButtonFrame object
                  JOptionPane.showMessageDialog(frame,
                        ButtonFrame.this.getLoanAmtText());
               }
            }

         });

      }

      @Override
      public void actionPerformed(ActionEvent ae) {
         throw new UnsupportedOperationException("Not supported yet.");
      }

   }
}
2 голосов
/ 23 октября 2011

Единственный способ получить доступ к loanAmt - через ButtonPanel .Потому что вы добавляете loanAmt к этой кнопке, верно?

Итак, если вы хотите получить доступ loanAmt .Вы должны получить все компоненты на этой кнопочной панели.Это мой псевдо-код, как получить доступ к вашему loanAmt из класса ButtonPanel.

b2.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        ButtonFrame bf = new ButtonFrame();
        if("calculate".equals(e.getActionCommand())) {
            // Get all component 
            java.awt.Component[] componentList = this.getComponents();
            JTextField txtField;
            String value;
            for (int i = 0; i < componentList.length; i++) {
                if (componentList[i].getClass().getName().equals("javax.swing.JTextField")) {
                    txtField = (JTextField) componentList[i];
                    value = textField.getText();
                }
            }
            if (value != null) JOptionPane.showMessageDialog(frame, value);
        }
    }
});
...