/ / Jak korzystać z linkedList i wielu klas w moim interfejsie graficznym Java - java, interfejs użytkownika, lista połączona

Jak korzystać z LinkedList i wielu klas z moim GUI Java - java, interfejs użytkownika, lista połączona

Jak używać połączonej listy z moim GUIprogram? Program ma mieć bloki (blok będący JPanelem) z obszarami tekstu i menu rozwijanymi. Liczba bloków zależy od tego, ile razy użytkownik naciska przycisk. Powinno być możliwe umieszczanie bloków w blokach. Chcę przechowywać utworzone informacje, używając połączonej listy, a następnie zapisać do pliku. Myślę, że w przypadku bloków podrzędnych byłyby połączone listy w połączonych lista. Czy powinienem używać Java.util.LinkedList? Jak dodać informacje? Klasa Node? Czy powinno to być w osobnym pliku? Zacząłem próbować uporządkować listę połączoną, ale wprawia mnie to w zakłopotanie.

Nadal nie jestem pewien, jak dana osoba jest przypuszczalnaaby stworzyć GUI. Widziałem tylko naprawdę proste GUI. Czy ktoś może mi powiedzieć, jak mam to zorganizować? W tej chwili mam trzy pliki, jeden dla głównego okna GUI, drugi dla bloków pytań wstawione w tym i jedno dla niektórych narzędzi do użycia w tych dwóch plikach, aby kod był łatwiejszy do zrozumienia. Ale wydaje się, że coś jest nie tak z plikiem bloku pytań, ponieważ robiłem białe tło dla każdego pliku JPanel, a po uruchomieniu programu wokół bloków pytań pojawia się szary kontur.

Prawdopodobnie nie powinienem wklejać tu mnóstwa kodu ... To są moje pliki: http://asj127.webs.com/BuildAssessmentWindow.java http://asj127.webs.com/QuestionBlock.java http://asj127.webs.com/JPanelTools.java

Odpowiedzi:

0 dla odpowiedzi № 1

Myślę, że powinieneś oddzielić model danych od GUI i tak, dodać listę (LinkedList lub ArrayList) do klasy 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);
}
}

Zauważ, że uczyniłem klasę możliwą do serializacji, dzięki czemu można ją łatwo zapisać lub odczytać z pliku.

W rzeczywistości ta struktura jest narywnym drzewem (lub lasem).

Na poziomie gui używanie listy byłoby zbędneponieważ kontener, taki jak JPanel, zawiera już listę wszystkich zawartych w nim komponentów, więc możesz po prostu użyć JPanel do przechowywania QuestionBlock wszystkich węzłów podrzędnych.

Połączyłbym QuestionBlock z ListNode1 zamiast listy:

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

Potrzebowałbyś również metody zapisywania odpowiedzi:

public void saveAnswers() {
node.setAnswerText((String)answerDropDown.getSelectedItem());
for (Component comp: getComponents()) {
if (comp instanceof QuestionBlock) {
((QuestionBlock)comp).saveAnswers();
}
}
}