Импорт строковой переменной, определенной слушателем, в другой пакет

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

Я читал об импорте переменных, однако я не уверен, как правильно внедрить код в мой существующий код.

package inputform;

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

public class Traitform extends JFrame {

        JPanel set1 = new JPanel();
        //add labels
        JRadioButton momEye1 = new JRadioButton("brown");
        JRadioButton momEye2 = new JRadioButton("blue");

        JPanel set2 = new JPanel();
        JRadioButton momHair1 = new JRadioButton("brown");
        JRadioButton momHair2 = new JRadioButton("blonde");

        JPanel set3 = new JPanel();
        JRadioButton dadEye1 = new JRadioButton("brown");
        JRadioButton dadEye2 = new JRadioButton("blue");

        JPanel set4 = new JPanel();
        JRadioButton dadHair1 = new JRadioButton("brown");
        JRadioButton dadHair2 = new JRadioButton("blonde");

        public Traitform () {
            super("Parent Trait Form");
            setSize(1000, 1000);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            GridLayout layout = new GridLayout(0,1);
            setLayout(layout);

            ButtonGroup group1 =  new ButtonGroup();
            group1.add(momEye1);
            group1.add(momEye2);

            class geneActionListener implements ActionListener {
            @Override
                public void actionPerformed(ActionEvent ex) {
                    String choice = group1.getSelection().getActionCommand();
                    System.out.println("trait selected" + choice);
            } 
        }
            ActionListener al = new geneActionListener();
            momEye1.addActionListener(al);
            momEye2.addActionListener(al);
            momEye1.setActionCommand("brown");
            momEye2.setActionCommand("blue");

            ButtonGroup group2 =  new ButtonGroup();
            group2.add(momHair1);
            group2.add(momHair2);

            ButtonGroup group3 =  new ButtonGroup();
            group3.add(dadEye1);
            group3.add(dadEye2);

            ButtonGroup group4 =  new ButtonGroup();
            group4.add(dadHair1);
            group4.add(dadHair2);

            set1.add(momEye1);
            set1.add(momEye2);

            set2.add(momHair1);
            set2.add(momHair2);

            set3.add(dadEye1);
            set3.add(dadEye2);

            set4.add(dadHair1);
            set4.add(dadHair2);

            add(set1);
            add(set2);
            add(set3);
            add(set4);

            setVisible(true);

            group1.getSelection().getActionCommand();         
        }

    private static void setLookAndFeel() {
        try{
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
                } catch (Exception exc){

            }
    }
        public static void main(String[] arguments){
            Traitform.setLookAndFeel();
            Traitform frame = new Traitform();
        }       
}   

Класс, в который я импортирую:

package parents;

import inputform.Traitform;

public class parents {

    public static void main(String[] arguments){

        // algorithm goes here to predict the odds of the child having blue or brown eyes
        // and blonde or brown hair

    }    
}

Я думал, что могу просто импортировать выбор переменной, используя import, но переменная «выбор» никогда не распознается в родительском классе, то есть она не импортируется. Я не уверен, как правильно импортировать переменную, поскольку онлайн-примеры предполагают, что это единственная задача.

алгоритм здесь — алгоритм входит в класс, содержащий данные. Например, у вас есть кнопка, по которой вы нажимаете, чтобы анализировать все данные из класса. Метод main() используется только для создания и отображения формы. Вся связанная обработка содержится в форме или в дочерних классах формы. И в вашем последнем вопросе (coderanch.com/t/713253/java/…) вам дали ссылку на учебник по Swing на How to Use Radio Buttons, в котором показано, как определять переменные, которые могут использоваться любым методом вашего класса формы.
camickr 27.07.2019 01:24

(1-) Вам также сказали, что НЕ следует определять класс в середине конструктора/метода. Таким образом вы можете определить анонимные внутренние классы.

camickr 27.07.2019 01:28

Хорошо, я сделаю это. Я разработал эту программу как попытку использовать все, что я узнал до сих пор, я думаю, мне просто нужно сделать это с другой программой. Я постараюсь закончить это как следует и перейду к новому проекту. Спасибо за помощь camickr.

programmalfunction 27.07.2019 05:07

Опубликованный код слишком длинный, чтобы продемонстрировать проблему. Опубликуйте минимальный воспроизводимый пример.

c0der 27.07.2019 09:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
93
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы добиться гибкости и лучшего разделения графического интерфейса и логики, рассмотрите возможность реализации шаблон mvc
. Проще говоря, используя этот шаблон, вы получаете «тупой» вид, который делает именно это.
У вас есть класс модели, который отвечает за хранение информации и логики, используемых представлением. У вас есть контроллер, который управляет: "связывает" представление и модель.
Ниже приведена версия вашего кода Макви(1), предназначенная для демонстрации возможного решения. Для удобства весь код можно скопировать в один файл (Traitform.java):

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

//better practice is to have a `JFrame instance rather than extending it 
public class Traitform extends JFrame { 

    public Traitform (Model model) {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        GridLayout layout = new GridLayout(0,1);
        setLayout(layout);

        JRadioButton momEye1 = new JRadioButton("brown");
        JRadioButton momEye2 = new JRadioButton("blue");
        ButtonGroup group1 =  new ButtonGroup();
        group1.add(momEye1);
        group1.add(momEye2);

        class geneActionListener implements ActionListener {
            @Override
            public void actionPerformed(ActionEvent ex) {
                String choice = group1.getSelection().getActionCommand();
                model.setChoice(choice);
            }
        }

        ActionListener al = new geneActionListener();
        momEye1.addActionListener(al);
        momEye2.addActionListener(al);
        momEye1.setActionCommand("brown");
        momEye2.setActionCommand("blue");

        JPanel set1 = new JPanel();
        set1.add(momEye1);
        set1.add(momEye2);

        add(set1);
        pack();
        setVisible(true);
    }

    public static void main(String[] arguments){
        new Controller();
    }
}

//controls and "wires" view and model
class Controller{
    Model model = new Model();   //construct a model
    Traitform view = new Traitform(model);   //construct a view 
}

//holds information and logic used by view
class Model{
    private String choice;

    String getChoice() {
        return choice;
    }

    void setChoice(String choice) {
        this.choice = choice;
        System.out.println("choice in model changed to "+ choice);
    }
} 

Используя эту простую структуру, представление (обозначенное Traitform в этом примере) обновляет модель представлением.
Контроллер содержит экземпляр Model, поэтому он может получить доступ к информации в нем с помощью model.getChoice().
Контроллер также может направить ссылку model на любой другой класс, которому это может понадобиться, или реализовать прослушиватель, который прослушивает изменения в Model.


(1) Posting mcve in questions makes help easier and quicker.

Другие вопросы по теме