我应该如何在GUI程序中使用链接列表?该程序应该具有textareas和下拉菜单的块(一个块是JPanel)。块数取决于用户按下按钮的次数。它应该可以将块放在块中。我想使用链接列表存储创建的信息,然后保存到文件。我在想,对于子块,链表中会有链表。 我应该使用Java.util.LinkedList吗?如何添加信息?一个Node类?这应该在一个单独的文件中吗?我开始试着坐在一个链表上,但这让我很困惑。
我仍然不确定一个人应该如何制作GUI。我只看到了非常简单的GUI。谁能告诉我如何安排事情呢?目前,我有三个文件,一个用于主GUI窗口,一个用于插入其中的问题块,另一个用于在这两个文件中使用的一些工具,以使代码更易于理解。但是,问题块文件似乎有问题,因为我一直在为每个JPanel制作背景白色,并且在运行程序时问题块周围有灰色轮廓。
我可能不应该在这里粘贴大量代码......这些是我的文件: http://asj127.webs.com/BuildAssessmentWindow.java http://asj127.webs.com/QuestionBlock.java http://asj127.webs.com/JPanelTools.java
答案 0 :(得分:0)
我认为你应该将数据模型与gui分开,是的,将一个列表(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-ary树(或森林)。
在gui级别,使用列表将是多余的,因为诸如JPanel之类的Container已经包含它包含的所有组件的列表,因此您可以简单地使用JPanel来保存所有子节点的QuestionBlock。 / p>
我会将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();
}
}
}