Передача значения радиокнопки из одного класса в другой - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть класс, который я написал, который использует консоль для ввода данных пользователем. Я пытаюсь создать графический интерфейс вокруг него, чтобы улучшить программу. В результате я создал новый класс GUI, который я хотел бы использовать для передачи значений обратно в существующий класс. Я часами рыскал по форуму и, похоже, не могу найти ответ, соответствующий моей конкретной проблеме

Самое близкое, что я нашел, было передать значение радиокнопки, которое выбрано для другого класса , и я фактически использовал рекомендацию этого класса. Это, кажется, работает "иногда", хотя. Что я имею в виду, когда я выбираю переключатель «один» в первый раз, ничего не происходит. Затем я нажимаю на второй переключатель и ничего не происходит (как и ожидалось). Когда я снова нажимаю на первый переключатель, он печатает текст на консоль, как и ожидалось. Я не могу понять, почему это не работает с первого клика. Во-вторых, каждый раз, когда я нажимаю на кнопку «секундная стрелка» и возвращаюсь на первую, она печатает ожидаемый результат в 2 раза больше, чем в предыдущий раз.

/// Класс переключателей

package views;

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.border.EmptyBorder;

import common.ButtonTester;

public class RadioButtons extends JFrame {

    private JPanel contentPane;
    private JRadioButton rdbtnOne, rdbtnTwo;
    private ButtonGroup grp;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    RadioButtons frame = new RadioButtons();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public RadioButtons() {
        setTitle("Button Demo");


        initComponents();
        createEvents();
    }


    **/// Components**
    private void initComponents() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);

        rdbtnOne = new JRadioButton("One");
        rdbtnTwo = new JRadioButton("Two");

        grp = new ButtonGroup();
        grp.add(rdbtnOne);
        grp.add(rdbtnTwo);

        GroupLayout gl_contentPane = new GroupLayout(contentPane);
        gl_contentPane.setHorizontalGroup(
            gl_contentPane.createParallelGroup(Alignment.LEADING)
                .addGroup(gl_contentPane.createSequentialGroup()
                    .addGap(126)
                    .addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
                        .addComponent(rdbtnTwo)
                        .addComponent(rdbtnOne))
                    .addContainerGap(189, Short.MAX_VALUE))
        );
        gl_contentPane.setVerticalGroup(
            gl_contentPane.createParallelGroup(Alignment.LEADING)
                .addGroup(gl_contentPane.createSequentialGroup()
                    .addGap(87)
                    .addComponent(rdbtnOne)
                    .addGap(48)
                    .addComponent(rdbtnTwo)
                    .addContainerGap(70, Short.MAX_VALUE))
        );
        contentPane.setLayout(gl_contentPane);

    }

    **/// Event handlers**
    private void createEvents() {
        rdbtnOne.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                rdbtnOne.addActionListener(new ButtonTester());
            }
        });
    }



}

/// Класс ButtonTester

package common;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class ButtonTester implements ActionListener {

    public static void main(String[] args) {

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Hello. I'm in the action Performed Method.");
    }

}

Я ожидаю, что каждый раз, когда я нажимаю на кнопку-переключатель 1, строка sysout запускается один раз.

1 Ответ

1 голос
/ 19 апреля 2019
private void createEvents() {
    rdbtnOne.addActionListener(new ActionListener() {
        // ****** A *****
        public void actionPerformed(ActionEvent e) {
            // ***** B ****
            rdbtnOne.addActionListener(new ButtonTester());
        }
    });
}

Строка ниже (A) добавляет ActionListener в ActionListener, что на самом деле не имеет смысла и является ненужным чрезмерным усложнением.Вот почему при первом нажатии кнопки видимых выходных данных не происходит, поскольку все, что происходит, это то, что за кулисами другой переключатель ActionListener добавляется к переключателю в строке (B).2-й раз, когда оба слушателя срабатывают, 3-е нажатие, больше слушателей срабатывают, поскольку вы продолжаете добавлять новых слушателей к кнопке.

Решение: упростить - добавить одного слушателя к кнопке и добавить его один раз и только один раз:

private void createEvents() {
    rdbtnOne.addActionListener(new ButtonTester());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...