

`JTextField text = new
JTextField("初期値");`で作成したテキストフィールド内の文字列を`getText`で取得したところ「初期値」をちゃんと取得できていました。しかし、テキストフィールド内の文字列「初期値」を削除したうえで別の文字列を入力し、再度`getText`を行っても取得される文字列は「初期値」のままでした(テキストフィールド内にあらかじめ設定されている文字列しか取得できない)。  
どうすればテキストフィールド内の文字列をきちんと取得できるのでしょうか？よろしくお願いします。現在、このコードのみでgetTextを行っています。

[code]

    import java.awt.EventQueue;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.border.EmptyBorder;
    public class registration extends JFrame {
    
      private static final long serialVersionUID = 1L;
      private JPanel contentPane;
      JTextField producttext;
      JTextField pricetext;
      /**
       * Launch the application.
       */
      public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    registration frame = new registration();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
      }
    
      /**
       * Create the frame.
       */
      public registration() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(null);
        setContentPane(contentPane);        
        // 商品登録部
        JLabel productlabel = new JLabel("name");
        producttext = new JTextField("");
        productlabel.setBounds(10, 10, 60, 20);
        contentPane.add(productlabel);
    
        producttext.setBounds(80, 13, 100, 20);
        contentPane.add(producttext);
    
        JLabel price = new JLabel("price");
        pricetext = new JTextField("");
        price.setBounds(10, 40, 60, 20);
        contentPane.add(price);
    
        pricetext.setBounds(80, 43, 100, 20);
        contentPane.add(pricetext);
    
        JButton addbutton = new JButton("登録");
        addbutton.setBounds(80, 70, 60, 30);
        addbutton.addActionListener(new addProduct());
        contentPane.add(addbutton);
    
      }
    
      public String[] getTextField(){
        String[] str;
        str = new String[2];
    
        str[0] = producttext.getText();
        str[1] = pricetext.getText();
        return str;
      }
      public void setTextField(){
        producttext.setText("");
        pricetext.setText("");
      }
    }
    
[/code]

[code]

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    
    
    public class addProduct implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            String str[];
            JFrame frame = new JFrame();
    
            registration gettext = new registration();
            str = gettext.getTextField();
    
            if(str[0].equals("") && str[1].equals("")){
                JOptionPane.showConfirmDialog(frame, "空欄です","Error!", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE);
            }else if(str[0].equals("")){
                JOptionPane.showConfirmDialog(frame, "nameが空欄です","Error!", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE);
            }else if(str[1].equals("")){
                JOptionPane.showConfirmDialog(frame, "priceが空欄です","Error!", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE);
            }else{
                JOptionPane.showConfirmDialog(frame, "登録完了","Message", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE);    
                gettext.setTextField();
            }
        }
    }
    
[/code]


CC BY-SA 3.0
2016-06-02T08:33:19.737
25385
2016-06-02T11:21:41.917
2016-06-02T11:21:41.917
46
9782
question
java swing
javaでのtextfield内の文字列取得について


`ActionListener`(`addProduct`)内で、新規の別`JFrame`(`registration`)を作成して、`getTextField()`を呼び出しているせいで、常に初期値が表示されています。

例えば、`addProduct`クラスを`registration`クラスの内部クラスにするなどして、現在表示している`registration`の`getTextField()`メソッドを呼び出すように修正してはどうでしょうか。

[code]

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.border.EmptyBorder;
    
    public class registration extends JFrame {
        private static final long serialVersionUID = 1L;
    
        private JPanel contentPane;
        JTextField producttext;
        JTextField pricetext;
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        registration frame = new registration();
                        frame.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    
        public registration() {
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(100, 100, 450, 300);
            contentPane = new JPanel();
            contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
            contentPane.setLayout(null);
            setContentPane(contentPane);
            // 商品登録部
            JLabel productlabel = new JLabel("name");
            producttext = new JTextField("");
            productlabel.setBounds(10, 10, 60, 20);
            contentPane.add(productlabel);
    
            producttext.setBounds(80, 13, 100, 20);
            contentPane.add(producttext);
    
            JLabel price = new JLabel("price");
            pricetext = new JTextField("");
            price.setBounds(10, 40, 60, 20);
            contentPane.add(price);
    
            pricetext.setBounds(80, 43, 100, 20);
            contentPane.add(pricetext);
    
            JButton addbutton = new JButton("登録");
            addbutton.setBounds(80, 70, 60, 30);
            addbutton.addActionListener(new addProduct());
            contentPane.add(addbutton);
        }
        public String[] getTextField() {
            String[] str = new String[2];
            str[0] = producttext.getText();
            str[1] = pricetext.getText();
            return str;
        }
        public void setTextField() {
            producttext.setText("");
            pricetext.setText("");
        }
    
        class addProduct implements ActionListener {
            @Override
            public void actionPerformed(ActionEvent event) {
                //String str[];
                //JFrame frame = new JFrame();
                // 新規のregistrationを作成している
                //registration gettext = new registration();
                //str = gettext.getTextField();
    
                Window frame = SwingUtilities.getWindowAncestor((Component) event.getSource());
                String[] str = getTextField();
    
                if (str[0].equals("") && str[1].equals("")) {
                    JOptionPane.showConfirmDialog(frame, "空欄です", "Error!", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE);
                } else if (str[0].equals("")) {
                    JOptionPane.showConfirmDialog(frame, "nameが空欄です", "Error!", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE);
                } else if (str[1].equals("")) {
                    JOptionPane.showConfirmDialog(frame, "priceが空欄です", "Error!", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE);
                } else {
                    JOptionPane.showConfirmDialog(frame, "登録完了", "Message", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE);
                    //gettext.setTextField();
                    setTextField();
                }
            }
        }
    }
    
[/code]

* * *

または、イベントソース(`JButton`)から`SwingUtilities.getWindowAncestor(...)`メソッドなどで親ウィンドウ(このサンプルでは`registration`)を取得して、`gettext.getTextField();`を呼び出しても良いかもしれません。

[code]

    public class addProduct implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent event) {
            Window frame = SwingUtilities.getWindowAncestor((Component) event.getSource());
            if (frame instanceof registration) {
                registration gettext = (registration) frame;
                String[] str = gettext.getTextField();
    
                if (str[0].equals("") && str[1].equals("")) {
                //以下省略...
    
[/code]


CC BY-SA 3.0
2016-06-02T10:48:16.137
25388
2016-06-02T11:05:32.720
2016-06-02T11:05:32.720
46
46
25385
answer