Dialogdesign med Java Swing – del 9

Det är dags att fixa klart en demo av dialogen när den används som en modal respektive icke-modal dialog, men först behöver vi en panel som vi kan återanvända i båda dialog-exemplen.

Vår dialogpanel (notera frånvaron av spagetti)

package com.golcher.tidsintervall.dialoger;

import com.golcher.tidsintervall.komponenter.valbara.EgnaIntervallPanel;
import com.golcher.tidsintervall.komponenter.valbara.StandardIntervallPanel;
import com.golcher.tidsintervall.komponenter.valda.ValdaIntervallPanel;
import com.golcher.tidsintervall.redigerare.IEgnaIntervallRedigerare;

import javax.swing.*;
import java.awt.*;

public class TidsintervallDialogPanel extends JPanel
{
    private StandardIntervallPanel _standardIntervallPanel;
    private EgnaIntervallPanel _egnaIntervallPanel;
    private ValdaIntervallPanel _valdaIntervallPanel;

    public TidsintervallDialogPanel(TidsintervallDialogModell modell, IEgnaIntervallRedigerare redigerare)
    {
        _standardIntervallPanel = new StandardIntervallPanel(modell);
        _egnaIntervallPanel = new EgnaIntervallPanel(modell, redigerare);
        _valdaIntervallPanel = new ValdaIntervallPanel(modell);

        fixaLayout();
    }

    private void fixaLayout()
    {
        this.setLayout(new FlowLayout(FlowLayout.LEADING));
        JPanel valbaraPanel = new JPanel();
        valbaraPanel.setLayout(new BoxLayout(valbaraPanel, BoxLayout.Y_AXIS));
        valbaraPanel.add(_standardIntervallPanel);
        valbaraPanel.add(_egnaIntervallPanel);
        this.add(valbaraPanel);
        this.add(_valdaIntervallPanel);
    }
}

Det blir inte mycket renare än så här – möjligen krävs användande av MigLayout för att få allt pixel-perfekt men panelen hanterar bara sina tre komponenter och placeringen av dem, inget annat.

Nu kan vi kika på att skapa ett icke-modalt exempel. Det innebär att vi behöver kunna skapa dialogmodellen utanför dialogen och registrera oss som lyssnare på den utanför dialogen, för att vi ska kunna få notifieringar om förändringar som sker i den medan den är öppen och aktiv.

Icke-modal dialog

package com.golcher.tidsintervall.dialoger.ickemodal;

import com.golcher.tidsintervall.dbproviders.ITidsIntervallDbProvider;
import com.golcher.tidsintervall.dbproviders.MockupProvider;
import com.golcher.tidsintervall.dialoger.TidsintervallDialogModell;
import com.golcher.tidsintervall.dialoger.TidsintervallDialogModellFabrik;
import com.golcher.tidsintervall.dialoger.TidsintervallDialogPanel;
import com.golcher.tidsintervall.komponenter.data.KomponentFilter;
import com.golcher.tidsintervall.komponenter.data.TidsintervallVo;
import com.golcher.tidsintervall.komponenter.data.TidsintervallWrapper;
import com.golcher.tidsintervall.redigerare.IEgnaIntervallRedigerare;

import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;

public class IckeModalDialogDemo extends JDialog
{
    private TidsintervallDialogPanel _panel;
    private TidsintervallDialogModell _modell;

    public IckeModalDialogDemo(TidsintervallDialogModell modell, IEgnaIntervallRedigerare redigerare)
    {
        _modell = modell;
        _panel = new TidsintervallDialogPanel(_modell, redigerare);

        this.setModal(false);
        this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        this.setLayout(new BorderLayout());
        this.add(_panel, BorderLayout.CENTER);
        this.setVisible(true);
    }
}

Sedan slänger vi ihop en testbädd som riggar dialogen och verifierar att vi får ut data ifrån den medan den används (alltså redan innan den stängs).

package com.golcher.tidsintervall.demo;

import com.golcher.tidsintervall.dbproviders.ITidsIntervallDbProvider;
import com.golcher.tidsintervall.dbproviders.MockupProvider;
import com.golcher.tidsintervall.dialoger.ITidsintervallModellLyssnare;
import com.golcher.tidsintervall.dialoger.TidsintervallDialogModell;
import com.golcher.tidsintervall.dialoger.TidsintervallDialogModellFabrik;
import com.golcher.tidsintervall.dialoger.ickemodal.IckeModalDialogDemo;
import com.golcher.tidsintervall.komponenter.data.KomponentFilter;
import com.golcher.tidsintervall.komponenter.data.TidsintervallWrapper;
import com.golcher.tidsintervall.redigerare.IEgnaIntervallRedigerare;

public class TestbaddIckeModalDialogDemo implements ITidsintervallModellLyssnare
{
    public static void main(String[] args)
    {
        new TestbaddIckeModalDialogDemo();
    }

    private final TidsintervallDialogModell _modell;

    public TestbaddIckeModalDialogDemo()
    {
        IEgnaIntervallRedigerare redigerare = null;
        ITidsIntervallDbProvider standardProvider = new MockupProvider(KomponentFilter.Standard);
        ITidsIntervallDbProvider egenProvider = new MockupProvider(KomponentFilter.Egen);
        ITidsIntervallDbProvider valdaProvider = new MockupProvider(KomponentFilter.Valda);
        _modell = TidsintervallDialogModellFabrik.skapaModell(standardProvider, egenProvider, valdaProvider);
        _modell.registreraLyssnare(this);
        IckeModalDialogDemo ickeModalDialog = new IckeModalDialogDemo(_modell, redigerare);
    }

    @Override
    public void modellenHarUppdaterats()
    {
        System.out.println("Modellen har uppdaterats:");
        for(TidsintervallWrapper wrapper : _modell.hamtaModellFor(KomponentFilter.Valda))
        {
            System.out.println(wrapper.toString());
        }
    }
}

Ladda ner och testkör koden från GitHub.

I nästa avsnitt tar vi oss an den modala dialogen som kräver lite mer fixande.