У меня есть пакет, который содержит мою форму ввода. Идея заключалась в том, что форма ввода будет записывать ответы и сохранять их как переменные, а затем я буду импортировать переменные в другой пакет, где алгоритм будет выполнять вычисления.
Я читал об импорте переменных, однако я не уверен, как правильно внедрить код в мой существующий код.
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, но переменная «выбор» никогда не распознается в родительском классе, то есть она не импортируется. Я не уверен, как правильно импортировать переменную, поскольку онлайн-примеры предполагают, что это единственная задача.
(1-) Вам также сказали, что НЕ следует определять класс в середине конструктора/метода. Таким образом вы можете определить анонимные внутренние классы.
Хорошо, я сделаю это. Я разработал эту программу как попытку использовать все, что я узнал до сих пор, я думаю, мне просто нужно сделать это с другой программой. Я постараюсь закончить это как следует и перейду к новому проекту. Спасибо за помощь camickr.
Опубликованный код слишком длинный, чтобы продемонстрировать проблему. Опубликуйте минимальный воспроизводимый пример.




Чтобы добиться гибкости и лучшего разделения графического интерфейса и логики, рассмотрите возможность реализации шаблон 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.
How to Use Radio Buttons, в котором показано, как определять переменные, которые могут использоваться любым методом вашего класса формы.