Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Jan Štěpánek:19.6.2020 15:37

Ahoj, mám tu prográmek po které chci aby mi na základě mnou vepsaných dat do textboxů vytvářel instance a ukládal je do kolekce.

zde je kod

Třída main

public class Main {
    public static void main(String[] args) {

        new ControlPanel();

    }
}

Třída Block (z té budu tvořit instance)

public class Block {
    private String templateName;
    private String blockName;
    private String strategyName;
    private String source;

    public Block(String templateName, String blockName, String strategyName, String source){
        this.templateName = templateName;
        this.blockName = blockName;
        this.strategyName = strategyName;
        this.source = source;
    }

Třída control panel (gui)

public class ControlPanel extends JFrame {
    private JTextField prvni = new JTextField(10);
    private JTextField druhy = new JTextField(10);
    private JTextField treti = new JTextField(10);
    private JTextField ctvrty = new JTextField(10);
    private JButton tlacitko = new JButton("ADD");
    private JPanel panel1 = new JPanel();
    private FlowLayout podklad = new FlowLayout();
    private Lists seznam = new Lists();


    public ControlPanel(){
        super("XML Creator");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        setSize(700, 400);
        setLayout(podklad);
        add(prvni);
        add(druhy);
        add(treti);
        add(ctvrty);
        add(tlacitko);
        pack();

        tlacitko.addActionListener(
                new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                         seznam.addBlock(new Block(prvni.getText(),druhy.getText(),treti.getText(),ctvrty.getText()));
                    }
                }
        );
    }

}

třída Lists (kolekce)

ublic class Lists implements InterfaceList {
    final private List<Block> blockList = new ArrayList<>();
    final private List<Declaration> declarationList = new ArrayList<>();
    final private List<String> stringXML = new ArrayList<>();

    public void addBlock(Block b){
        blockList.add(b);
    }

    public List<Block> getBlockList() {
        return blockList;
    }

Zkusil jsem: Problém se mi povedlo vyřešit když jsem kolekci a metody v třídě Lists dal na static, tím pádem vše patří třídě a já se na to mohu libovolně odkazovat kde chci. No vzhledem k tomu že jsem na to přišel sám tak mi to právě přijde podezřelé :-) jestli se mi to nepovedlo spíš nějak obejít a správně řešení je někde jinde.

Chci docílit: Problém je že když přes třídu ControlPanel naplním kolekci instancema tak se na ní nemohu odkazovat nikde jinde než v rámci té třídy a já bych právě chtěl mít další třídu kde bych s touto naplněnou kolekcí mohl dál pracovat což mi nejde (nebo neumím).

 
Odpovědět
19.6.2020 15:37
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:20.6.2020 10:46

Počkej a kde máš teda problém?
Vždyť všechno funguje v pořádku. Zkoušel jsem si to a instance skutečně přidáváš do listu (mimochodem neříkej nikde, že pracuješ na addBlocku :) nebo tě zažalují za porušení autorských práv:))
No a pak z toho listu vypíšeš instance.
Jestli chceš vypsat konkrétní texty, které do té instance vložíš, tak nejdřív musíš vytvořit gettery ve třídě Block. Potom vytvoř soukromou metodu ve třídě Control panel, která by mohla vypadat nějak takhle:

private void output(Block block) {
    String result = "Instance " + block + ":\n";
    if (block.getTemplateName() != null) {
        result += "Block template name = " + block.getTemplateName() + "\n";
    }
    if (block.getBlockName() != null) {
        result += "Block name = " + block.getBlockName() + "\n";
    }
    if (block.getStrategyName() != null) {
        result += "Block strategy name = " + block.getStrategyName() + "\n";
    }
    if (block.getSource() != null) {
        result += "Block source = " + block.getSource();
    }
    JOptionPane.showMessageDialog(null, result);
}

No a potom si vytvoříš tlačítko2, přidáš si na něj actionListenera a vypíšeš si to

tlacitko2.addActionListener(action -> {
    seznam.getBlockList().forEach(evt -> {
        output(evt);
    });
});
Nahoru Odpovědět
20.6.2020 10:46
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
MpCk
Člen
Avatar
Odpovídá na Jan Štěpánek
MpCk:22.6.2020 7:08

Kdyz v controlPanel naplnis INSTANCI Listu instancemi bloku, tak se na ni nemuzes odkazovat jinde..to jenaprosto spravne, promenna seznam je privatni v controlPanelu.. aby jsimohl se na ni odkazovat jinde, potrebujes ji z controlPanelu te tve jine tride nejak predat, treba v construktoru tve nove tridy..

 
Nahoru Odpovědět
22.6.2020 7:08
Avatar
Jan Štěpánek:23.6.2020 13:06

Ahoj díky za tipy nakonec jsem našel že se na pro tyto případy hodí použít návrhový vzor singleton - takže jsem ve třídě Lists zakázal konstruktor a vytvořil kolekce jako private static final + jsem vytvořil potřebné statické metody. Nevím či je to nejlepší řešení ale pro mě vyhovující :)

 
Nahoru Odpovědět
23.6.2020 13:06
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.