Как сохранить переменную из класса формы Gui в другой класс - PullRequest
0 голосов
/ 28 апреля 2018

Я работаю над программой с графическим интерфейсом. пользователь вводит число, которое слушатель действия сохраняет в переменной, а затем отправляет эту переменную классу main, в котором она сохраняется в другой переменной. Проблема в том, что в настоящее время я не сохраняю значение должным образом (иногда это сохраняет, а иногда нет. Я хочу, чтобы, когда пользователь вводит значение в графическом интерфейсе, а затем нажимает кнопку, в которой это значение сохраняется переменная в основном классе. Я новичок в Java, поэтому, пожалуйста, извините за мое ужасное кодирование. Это мой основной класс.

    public class Main {
public static boolean Click=false;
public static void main(String[] args) {
    int n=0, i;
    JFrame Frame = new JFrame();
    Input1 I1 = new Input1();
    Frame.setSize(600, 600);
    Frame.setLocationRelativeTo(null);
    Frame.setContentPane(I1.Input1Panel);
    Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Frame.pack();
    Frame.setVisible(true);
    while (Click==false) {
        n = I1.Setn();
        System.out.println(""+n);
    }

А это мой класс по графическому интерфейсу.

    public class Input1 {
private JButton doneButton;
private JTextField textField1;
private JLabel Title;
private JLabel EnterNum;
public JPanel Input1Panel;

public int n;

Main M = new Main();

public Input1() {
    doneButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            n = Integer.parseInt(textField1.getText());
            while (M.Click==false) {
                if (n==0) {
                    n = Integer.parseInt(textField1.getText());
                }
                else {
                    M.Click=true;
                }
            }
        }
    });
}
public int Setn() {
    return n;
}

}

Новый код Основной класс

    public class Main {
public static void main(String[] args) {
    int n=0, i;
    JFrame Frame = new JFrame();
    Input1 I1 = new Input1();
    Frame.setSize(600, 600);
    Frame.setLocationRelativeTo(null);
    Frame.setContentPane(I1.Input1Panel);
    Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Frame.pack();
    Frame.setVisible(true);
    while (n==0) {
        n = I1.Setn();
        //System.out.println(""+n);
    }
    System.out.println("Main:"+n);

Класс GUI

    public class Input1 {
private JButton doneButton;
private JTextField textField1;
private JLabel Title;
private JLabel EnterNum;
public JPanel Input1Panel;

public int n;

Main M = new Main();

public Input1() {
    doneButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            n = Integer.parseInt(textField1.getText());
            System.out.println("Action Listener:"+n);
        }
    });
}
public int Setn() {
    return n;
}

}

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

После дальнейших исследований я смог найти решение, и все, что мне нужно было сделать, - это указать «volatile» при объявлении n. Для разъяснения перейдите на этот сайт. Цикл не видит измененное значение без оператора печати . Мой код в настоящее время.

    volatile public static int n=0;
public static void main(String[] args) {

    int i=0;

    JFrame Frame = new JFrame();
    Input1 I1 = new Input1();
    Input2 I2 = new Input2();

    Frame.setSize(600, 600);
    Frame.setLocationRelativeTo(null);
    Frame.setContentPane(I1.Input1Panel);
    Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Frame.pack();
    Frame.setVisible(true);
    while (n==0) {
        n = I1.Setn();
    }
0 голосов
/ 28 апреля 2018

Кажется, вы немного усложняете вещи. Кроме того, прочитайте комментарий @pvg сделал. Вы не объясняете точно проблему. Кроме того, каков ваш код, я не могу понять, что именно вы пытаетесь сделать.

В случае, если вы хотите получить ввод из текстового поля и сделать что-то с этим:

package test;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class Test {

    private JFrame frame;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        // Swing applications must run on EDT thread. Use this method to achieve that.
        EventQueue.invokeLater(() -> {
            try {
                Test window = new Test();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }

    /**
     * Create the application.
     */
    public Test() {
        frame = new JFrame();
        frame.setPreferredSize(new Dimension(300, 300));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new FlowLayout());
        addComponents();
        frame.pack();
    }

    private void addComponents() {
        JTextField txtInput = new JTextField("Input: ");
        txtInput.setEditable(false);
        frame.getContentPane().add(txtInput);
        JTextField inputField = new JTextField();
        inputField.setColumns(10);
        frame.getContentPane().add(inputField);
        JButton getInputBtn = new JButton("Click me to give the input");
        getInputBtn.addActionListener(e -> {
            String input = inputField.getText(); 
            System.out.println("The input is: " + input); //Do something with the input.
        });
        frame.getContentPane().add(getInputBtn);
    }

}

Я вижу, что вы анализируете целое число из входных данных. То, как вы справляетесь с этим, может дать вам NumberFormatException . Я предлагаю вам прочитать Как использовать форматированное текстовое поле , чтобы избежать этого.

P.S: Добавить тег "swing" к вашему сообщению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...