如何在Java GUI中使用链接List和多个类

时间:2010-04-10 17:34:45

标签: java user-interface linked-list

我应该如何在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

1 个答案:

答案 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();
        }
    }
}