Я думаю, что вы должны отделить модель данных от графического интерфейса и, да, добавить список (LinkedList или ArrayList) в класс ListNode1:
public class ListNode1 implements java.io.Serializable {
private String num;
private String questionText;
private String answerText;
private List<ListNode1> subNodes = new LinkedList<ListNode>();
...
public List<ListNode1> getSubNodes() {
return subNodes;
}
public void addSubNode(ListNode1 subNode) {
subNodes.add(subNode);
}
public void removeSubNode(ListNode1 subNode) {
subNodes.remove(subNode);
}
}
Обратите внимание, что я сделал класс сериализуемым, чтобы вы могли легко сохранить его или прочитать из файла.
Эта структура на самом деле является n-арным деревом (или лесом).
На уровне графического интерфейса использование списка было бы излишним, поскольку такой контейнер, как JPanel, уже содержит список всех содержащихся в нем компонентов, поэтому вы можете просто использовать JPanel для хранения вопросительных блоков всех подузлов.
Я бы связал QuestionBlock с ListNode1 вместо списка:
public class QuestionBlock extends JPanel {
private JPanel container;
private JComboBox numberDropDown, answerDropDown;
private JTextArea question;
private ListNode1 node;
public QuestionBlock(ListNode1 node)
{
super(new FlowLayout());
//setLocation(new Point(0, 0));
setVisible(true);
//setSize(800, 610);
//setBackground(new Color(0, 0, 0));
this.node=node;
createGUI();
}
public void createGUI()
{
container = new JPanel();
container.setLayout(new BorderLayout());
numberDropDown = new JComboBox();
numberDropDown.addItem("1.");
numberDropDown.addItem("a.");
container.add(panelTools.addThisComponent(numberDropDown), BorderLayout.LINE_START);
questionsBlock = panelTools.addNewJPanel();
questionsBlock.setLayout(new BorderLayout());
question = new JTextArea(4, 30);
question.setText(node.getQuestionText);
question.setBackground(new Color(250, 250, 250)); //light gray color for noticeability
questionsBlock.add(panelTools.addThisComponent(question), BorderLayout.PAGE_START);
answerDropDown = new JComboBox();
answerDropDown.addItem("--Select--");
answerDropDown.addItem("SubQuestion");
questionsBlock.add(panelTools.addThisComponent(answerDropDown), BorderLayout.PAGE_END);
container.add(questionsBlock, BorderLayout.CENTER);
add(container);
for (ListNode1 subNode: node.getSubNodes()) {
add(new QuestionBlock());
}
}
}
Вам также понадобится метод для сохранения ответов:
public void saveAnswers() {
node.setAnswerText((String)answerDropDown.getSelectedItem());
for (Component comp: getComponents()) {
if (comp instanceof QuestionBlock) {
((QuestionBlock)comp).saveAnswers();
}
}
}