Как использовать связанный список и несколько классов с моим графическим интерфейсом Java - PullRequest
1 голос
/ 10 апреля 2010

Как мне использовать связанный список с моей программой GUI? Предполагается, что в программе есть блоки (блок JPanel) с текстовыми областями и выпадающими меню. Количество блоков зависит от того, сколько раз пользователь нажимает кнопку. Предполагается, что можно размещать блоки внутри блоков. Я хочу сохранить созданную информацию, используя связанный список, а затем сохранить в файл. Я думаю, для субблоков, будут связаны списки в связанном списке. Должен ли я использовать Java.util.LinkedList? Как мне добавить информацию? Класс Node? Это должно быть в отдельном файле? Я начал пытаться составить связанный список, но меня это смущает.

Я все еще не уверен в том, как человек должен создавать GUI. Я видел только очень простые графические интерфейсы. Может кто-нибудь сказать мне, как я должен устроить вещи? На данный момент у меня есть три файла, один для главного окна графического интерфейса, один для блоков вопросов, которые будут вставлены в него, и один для некоторых инструментов, которые будут использоваться в этих двух файлах для облегчения понимания кода. Но, похоже, что-то не так с файлом блока вопросов, потому что я делаю фон белым для каждой JPanel, и когда я запускаю программу, вокруг блоков вопросов появляется серый контур.

Я, наверное, не должен вставлять сюда тонну кода ... Это мои файлы: http://asj127.webs.com/BuildAssessmentWindow.java http://asj127.webs.com/QuestionBlock.java http://asj127.webs.com/JPanelTools.java

1 Ответ

0 голосов
/ 10 апреля 2010

Я думаю, что вы должны отделить модель данных от графического интерфейса и, да, добавить список (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();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...