JTextField в JDialog сохраняет значение после удаления - PullRequest
1 голос
/ 14 марта 2012

У меня проблема с JTextField.Мне нужно получить текст из JTextField и изменить его позже в JDialog.Я использую ту же переменную для JTextField.До тех пор, пока вы не войдете в диалоговое окно, напечатанная строка будет тем, что вы ввели в текстовое поле.Если вы введете строку в диалоговом окне, она будет печатать только эту строку до тех пор, пока вы снова не измените ее в диалоговом окне (делает основное текстовое поле бесполезным).Я могу исправить это, добавив отдельную переменную, но хотел бы попытаться избежать ненужных объявлений.У меня сложилось впечатление, что это не должно иметь значения, так как я создаю новый объект JTextField и также избавляюсь от диалогового окна.Я что-то пропустил?Какие-нибудь мысли?

Вот макет моей проблемы.

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

public class textfield extends JPanel {

    private JTextField textfield;
    private JButton printButton, dialogButton, okayButton;
    private static JFrame frame;

    public static void main(String[] args) {
        frame = new JFrame();
        frame.setSize(200,200);
        frame.getContentPane().add(new textfield());
        frame.setVisible(true);
    }

    private textfield() {
        textfield = new JTextField(10);
        add(textfield);
        ((AbstractButton) add(printButton = new JButton("Print"))).addActionListener(new printListener());
        ((AbstractButton) add(dialogButton = new JButton("Dialog"))).addActionListener(new dialogListener());

    }

    private class printListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            String string = null;
            string = textfield.getText();
            System.out.println(string);
        }
    }

    private class dialogListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            final JDialog dialog = new JDialog(frame, "Dialog", true);
            JPanel p = new JPanel();
            textfield = new JTextField(10);
            p.add(textfield);
            p.add(okayButton = new JButton(new AbstractAction("Okay") {
                public void actionPerformed(ActionEvent e) {
                    String string = null;
                    string = textfield.getText();
                    System.out.println(string);
                    dialog.dispose();
                }
            }));
            dialog.add(p);
            dialog.pack();
            dialog.setVisible(true);

        }
    }   
}

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

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

1 голос
/ 14 марта 2012

ваша переменная private JTextField textfield; используется дважды, во-первых для JFrame, а во второй раз для JDialod, немного изменено ..

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractAction;
import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class MyTextfield extends JPanel {

    private static final long serialVersionUID = 1L;
    private JTextField textfield, textfield1; //added new variable
    private JButton printButton, dialogButton, okayButton;
    private static JFrame frame;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {//added initial thread

            @Override
            public void run() {
                frame = new JFrame();
                frame.setSize(200, 200);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//added default close operation
                frame.getContentPane().add(new MyTextfield());
                frame.setVisible(true);
            }
        });
    }

    private MyTextfield() {
        textfield = new JTextField(10);
        add(textfield);
        ((AbstractButton) add(printButton = new JButton("Print"))).addActionListener(new printListener());
        ((AbstractButton) add(dialogButton = new JButton("Dialog"))).addActionListener(new dialogListener());

    }

    private class printListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            String string = null;
            string = textfield.getText();
            System.out.println(string);
        }
    }

    private class dialogListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            final JDialog dialog = new JDialog(frame, "Dialog", true);
            JPanel p = new JPanel();
            textfield1 = new JTextField(10);
            p.add(textfield1);
            p.add(okayButton = new JButton(new AbstractAction("Okay") {

                private static final long serialVersionUID = 1L;

                public void actionPerformed(ActionEvent e) {
                    String string = null;
                    textfield.setText(textfield1.getText());
                    System.out.println(string);
                    dialog.dispose();
                }
            }));
            dialog.add(p);
            dialog.pack();
            dialog.setVisible(true);
        }
    }
}
...