Archief - [JAVA] Eerste echte programma schrijven: algemene vragen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Foezjie

Legacy Member
Hallo iedereen,

na mijn eerste jaar Informatica gedaan te hebben was ik deze zomer van plan een echt deftig programma te schrijven. Ben dus al half en half begonnen. Het wordt een programma dat bijhoudt welke episodes, seizoenen van een bepaalde serie je al gezien hebt.

Dit is een snelle schets van de GUI:
forums


Programmeertechnisch gezien heb ik al de fundamenten van het programma: de verschillende klasses met de basismethodes en een paar extra's.

Op school hebben we al eens een groot programma moeten schrijven (project voor het vak Objectgericht Programmeren) maar daar was nergens echt sprake van interactie met een gebruiker.

De problemen die ik nu heb, hebben vooral te maken met hoe ik de verschillende acties die de gebruiker kan doen moet verwerken in de code.

Als bijvoorbeeld een gebruiker iets aanklikt wordt dit geregistreerd in mijn klasse MainWindow. Die wijst dan door naar een klasse Actions.

Een eerste probleem dat ik nu denk een beetje deftig opgelost te hebben is het aanpassen van de collectie. Daarmee bedoel ik aanpassingen aan de verzameling van ArrayLists met respectievelijk Series, Seizoen en Episodes (Ik heb dus een ArrayList van Series in mijn classe ShowCollection, een ArrayList van Seizoenen in mijn classe Show, ...)
Ik werk met een klasse SystemVariables die onder andere de ShowCollection bijhoudt met alle Series. Deze wordt in de main aangemaakt en steeds doorgeven naar alle klasses die mogelijks aanpassingen moeten doen aan die ShowCollection.

Een ander probleem dat ik heb is hoe ik de collectie van de gebruiker moet opslaan. Ik had gedacht om deze weg te schrijven naar een XML bestand. Dit lijkt mij doenbaar voor simpele dingen (zie hier ) maar ik weet niet in welke mate dit geschikt is om ook een goed vormgegeven XML document te hebben als je werkt met ArrayLists enzo als attributen. Weet iemand of dit zal werken? (Indien nee, een alternatief?)

Zoals je kan zien op de afbeelding werk ik met een Tree om de collectie van de gebruiker weer te geven. Het probleem dat ik hierbij heb is dat ik geprobeerd heb een testboompje te maken en weer te geven, maar dit lukt mij niet.
Hier is de code van MainWindow:

Code:
package jWatched.GUI;

import jWatched.Program.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;

public class MainWindow extends Actions implements ActionListener {

    private JMenuBar bar;
    private JMenuItem file, action;
    private JMenuItem close, addSeason, showStats;
    private JTree tree;

    public MainWindow(SystemVariables vars) {
        super(vars);

        DefaultMutableTreeNode top = new DefaultMutableTreeNode("Collection");
        createNodes(top);
        tree = new JTree(top);      

        JFrame frame = new JFrame("jWatched");
        frame.setContentPane(setUpContentPane());
        frame.setJMenuBar(constructMenuBar());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 500);

        frame.setVisible(true);
    }

    private JPanel setUpContentPane() {
        JPanel totalGUI = new JPanel();
        totalGUI.setLayout(null);

        JScrollPane treeView = new JScrollPane(tree);
        totalGUI.add(treeView);
        
        return totalGUI;
    }

    private JMenuBar constructMenuBar() {
        bar = new JMenuBar();

        //File
        file = new JMenu("File");
        file.setMnemonic(KeyEvent.VK_F);
        bar.add(file);

        //File -> Close
        close = new JMenuItem("Close");
        close.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.ALT_MASK));
        file.add(close);
        close.addActionListener(this);

        //Action
        action = new JMenu("Action");
        action.setMnemonic(KeyEvent.VK_A);
        bar.add(action);

        //Action -> Add show
        addSeason = new JMenuItem("Add new show");
        addSeason.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.ALT_MASK));
        action.add(addSeason);
        addSeason.addActionListener(this);

        //Action -> Show stats
        showStats = new JMenuItem("Show stats");
        action.add(showStats);
        showStats.addActionListener(this);
        return bar;
    }

    private void createNodes(DefaultMutableTreeNode top) {
        DefaultMutableTreeNode season = null;
        DefaultMutableTreeNode episode = null;

        Show newShow = new Show("Friends", 10);
        Season season1 = new Season(newShow, 1);

        season = new DefaultMutableTreeNode(season1.getName());
        top.add(season);
        
        episode = new DefaultMutableTreeNode(new Episode("Episode 1", season1, 1));
        season.add(episode);

        episode = new DefaultMutableTreeNode(new Episode("Episode 2", season1, 2));
        season.add(episode);
        
        episode = new DefaultMutableTreeNode(new Episode("Episode 3", season1, 3));
        season.add(episode);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == close) {
            System.exit(0);
        } else if (e.getSource() == addSeason) {
            addNewShow(vars);
        } else if (e.getSource() == showStats) {
            showStats();
        }
    }
}

Ik krijg dus wel mijn venster, maar mijn Tree wordt niet getoond. Weet iemand waaraan dit ligt?

In het kort dus:
  • Is het mogelijk de collectie op te slaan in XML?
  • Waarom wordt mijn tree niet getoond?

Alle hulp wordt ten zeerste geapprecieerd :niceone:

Foezjie

Curahee Q

Legacy Member
Je moet natuurlijk wel je Tree toevoegen aan je JFrame.

Je zou ook je objecten gewoon kunnen opslagen in een tekstbestand. Kijk eens naar serializable.

Gurdt

Legacy Member
Ik ben nu toevallig met Qt Jambi bezig, als je daarmee bezig was hielp ik je graag. Maar Swing weiger ik, na mijn ervaring met een vorig project xd

Natuurlijk kan je je collectie opslaan in XML, maar misschien - ik weet niet tot waar je kennig reikt - is een database handiger :)

NeverwinterX

Legacy Member
Hij voegt wel de tree toe: hij steekt dit in een scrollpane en dat in een jpanel en dat in het frame. Verwijder totalGUI.setLayout(null); en dan werkt het. Hier vind je meer over layouts. En vergeet niet frame.pack(); te doen voor je het zichtbaar maakt.

Kies eerst voor een gemakkelijke oplossing voor het opslaan zoals gewone standaard object serialisatie naar een file. Daarmee kan je gewoon een hele collectie van series bvb naar een file zwieren en terughalen. Ik heb de indruk dat je deze applicatie vooral maakt om eerst wat basiservaring op te doen. Later kan je nog altijd een andere oplossing zoals een database toevoegen.

Ik snap niet echt de bedoeling van de klasse Actions.
Kijk hier eens naar: How to Use Actions (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Other Swing Features)

Hou er ook rekening mee dat je best zorgt voor een strikte scheiding tussen de GUI klassen/objecten en de "domein" klassen/objecten (hier zijn dat mogelijk series, seizoenen ...): GUI klassen mogen domein klassen gebruiken, maar niet omgekeerd. Je kan verder gaan en het MVC patroon gebruiken of iets dergelijks (mvc, mvvw, pac, mva, allemaal één pot nat), maar die scheiding is het voornaamste.

Voor die systemvariables zou ik de volgende oplossing genomen hebben. Vermoedelijk ga je toch klassen als Serie e.d. maken. Dan maak je een manager/registry klasse zoals SerieManager die bovendien singleton is en alle aanpassingen aan de lijst van series enzo regelt. De GUI moet dan naar dat singleton om aanpassingen te doen. (Of niet als singleton en dan houdt de gui een referentie naar een manager.) En zonodig doe je dat ook voor seizoenen en episodes enzo.

Soulless

Legacy Member
object serialisatie, dat zou in een algemene faq van dit forum thuishoren :) waar zitten die mods hier :(

Foezjie

Legacy Member
Bedankt voor de reacties, zal dit morgen eens allemaal uitproberen:niceone:

Foezjie

Legacy Member
NeverwinterX zei:
Kies eerst voor een gemakkelijke oplossing voor het opslaan zoals gewone standaard object serialisatie naar een file. Daarmee kan je gewoon een hele collectie van series bvb naar een file zwieren en terughalen.

Ik vind niet direct uitleg op google dus vraag ik het maar hier: bij die serialisatie maak ik mij wat zorgen.
Ik zit namelijk met heel wat dubbele bindingen en ik weet niet of deze altijd behouden blijven. Moeten de objecten daarvoor in een bepaalde volgorde weggeschreven worden of doet dit er niet toe?

En ook: is er een methode om alle objecten die momenteel in gebruik zijn op te slaan? Dit zou alles veel gemakkelijker maken denk ik..

Cycloon

Legacy Member
Object serializatie zorgt er zelf voor dat alle geassocieerde objecten ook geserializeerd worden. Stel dat je een boomstructuur zou serializeren dan moet je enkel de root serializeren, de rest volgt vanzelf. Het spreekt wel vanzelf dat alle geassocieerde objecten ook serializeerbaar moeten zijn.

Foezjie

Legacy Member
Cycloon zei:
Object serializatie zorgt er zelf voor dat alle geassocieerde objecten ook geserializeerd worden. Stel dat je een boomstructuur zou serializeren dan moet je enkel de root serializeren, de rest volgt vanzelf. Het spreekt wel vanzelf dat alle geassocieerde objecten ook serializeerbaar moeten zijn.

Maar het doet er dus niet toe of ik eerst bijvoorbeeld een seizoen inlaad, dat dan zogezegd even een null-referentie heeft naar zijn parent show, totdat die show zelf dan ingeladen is?

Cycloon

Legacy Member
Je kan niet zomaar eventjes de helft inladen. Van zodra je 1 object serializeert volgt de rest, tenzij je aangeeft (dmv van het transient keyword) dat die niet geserializeerd moet worden, dan wordt deze een null-referentie. Als je dan deserializeert zal de héle structuur terug zijn zoals daarvoor, inclusief inner-objecten.

Foezjie

Legacy Member
Cycloon zei:
Je kan niet zomaar eventjes de helft inladen. Van zodra je 1 object serializeert volgt de rest, tenzij je aangeeft (dmv van het transient keyword) dat die niet geserializeerd moet worden, dan wordt deze een null-referentie. Als je dan deserializeert zal de héle structuur terug zijn zoals daarvoor, inclusief inner-objecten.

Aaah, dus als ik mijn Collection klasse, waarin dus een ArrayList naar de Shows zit (en in iedere Show een ArrayList naar de seasons), serialiseer, komt alles direct mee?

Cycloon

Legacy Member
Jep, maar dan moeten alle subelementen zoals je Shows ook serializeerbaar zijn. Mocht dit niet het geval zijn zou je toch een exceptie krijgen ;)

Foezjie

Legacy Member
Cycloon zei:
Jep, maar dan moeten alle subelementen zoals je Shows ook serializeerbaar zijn. Mocht dit niet het geval zijn zou je toch een exceptie krijgen ;)

Dit vermakkelijkt veel :p
Bedankt ^^
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan