Kello ja Hokkeli


Kuvamatriisi - java


Tässä on demokoodi kuvamatriisin esittämiseksi. Koodi on kirjoitettu Eclipsessä.

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Composite;

import java.util.ArrayList;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;

// Kuva ja teksti ovat Groupin sisällä, ja Groupit ovat Rowlayout:ssä

//--------------------------------
// 10.5.2020
public class Kuvamatr
{
    private Display display;
    private Composite c1;
    private ScrolledComposite sc;
    private ArrayList<Image> kuvat;   // tähän kerätään esillä olevat kuvat
    private boolean valmis = false;
    private boolean macissa;
    private Shell shell;

    // ---------------------------------
    // 4.5.2020   KM99
    public static void main(String[] args)
    {
        try
        {
            Kuvamatr window = new Kuvamatr();
            window.open();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    // ---------------------------------
    // 10.5.2020    KM98
    public void open()
    {
        macissa = mikaKone().contentEquals("MAC");
        display = Display.getDefault();
        createContents();
        shell.open();
        shell.layout();
        aloitusHommia();
        while (!shell.isDisposed())
        {
            if (!display.readAndDispatch())
            {
                display.sleep();
            }
        }
        for (Image ima : kuvat)   // vapautetaan kuvien valtaama tila
            ima.dispose();
    }

    // ---------------------------------------------
    // 9.3.2020   KM04
    // Tehdään skaalattu kuva
    // Huom! Muista lopuksi poistaa käytetty kuva
    private Image skaalattuKuva(Display display, ImageData alku, int maxW, int maxH)
    {
        if (alku == null)
            return null;
        int uusiH = maxH;
        int uusiW = (alku.width * uusiH) / alku.height;
        if (uusiW > maxW)
        {
            uusiW = maxW;
            uusiH = (alku.height * uusiW) / alku.width;
        }
       
        Image uusIma = new Image(display, uusiW, uusiH);
        GC gc = new GC(uusIma);
        Image vanIma = new Image(display, alku);
        gc.drawImage(vanIma, 0, 0, alku.width, alku.height, 0, 0, uusiW, uusiH);
       
        vanIma.dispose();
        gc.dispose();
        return uusIma;
    }
   
    // ----------------------------------------------------
    // 9.3.2020   KM33
    // Missä koneessa olemme: MAC, WIN10, WIN8
   // String mikaz = Meka.mikaKone();  // MAC, WIN10, WIN8
    private String mikaKone()
    {
        String osz = System.getProperty("os.name").toLowerCase();
        if (osz.indexOf("mac") != -1)
            return "MAC";
        if (osz.indexOf("windows 10") != -1)
            return "WIN10";
        return "WIN8";
    }

    // --------------------------------
    // 10.5.2020   KM01
    private void aloitusHommia()
    {
        String patz = (macissa) ? "/Volumes/DATALEVY/KUVAT/Koekuvat/" : "E:/KUVAT/Koekuvat/";
        kuvat = new ArrayList<Image>();  // tähän kerätään esillä olevat kuvat

        Label lblKuva;
        Label lblNimi;
        RowLayout rowlay = new RowLayout();
        rowlay.type = SWT.VERTICAL;
        Group group;

        for (int i=0; i<10; i++)
        {
            ImageData imgData = new ImageData(patz + "kuva" + i + ".jpg");
            Image image = skaalattuKuva(display, imgData, 142, 138);
            kuvat.add(image);

            group = new Group(c1, SWT.NONE);
            group.setText("");
            group.setLayout(null);
            group.setLayoutData(new RowData(144, 160));

            lblKuva = new Label(group, SWT.NONE);
            int lev = image.getBounds().width;
            int kork = image.getBounds().height;
            lblKuva.setImage(image);
            if (macissa)
                lblKuva.setBounds((144-lev)/2 + 3, 138-kork+4, lev, kork);  // Mac
            else
                lblKuva.setBounds((144-lev)/2 + 3, 138-kork+10, lev, kork);  // Windows
           
            lblKuva.setData("idkoh", i);
            lblKuva.addMouseListener(new MouseAdapter()
            {
                @Override
                public void mouseDoubleClick(MouseEvent e)
                {
                    Label x = (Label) e.getSource();
                    int idkoh = (int) x.getData("idkoh");
                    System.out.println("kuvaa " + idkoh + " kaksoisklikattu");
                }
            });
            teeMenu(lblKuva);
            lblNimi = new Label(group, SWT.NONE);
            lblNimi.setText("kuva" + i + ".jpg");
            if (macissa)
                lblNimi.setBounds(2,152,142,20);    // Mac
            else
                lblNimi.setBounds(2,156,142,20);   //  Windows
        }
        sc.setMinSize(445, scrollKorkea());  // width, height
        valmis = true;
    }

    // --------------------------------------------
    // 9.5.2020   KM09
    // lasketaan skrollattavan alueen korkeus
    private int scrollKorkea()
    {
        int w = shell.getBounds().width;
        int iklev = (macissa) ? 167 : 149;  // yhden ruudun leveys
        int ikkor = (macissa) ? 189 : 168;  // yhden ruudun korkeus
        int kuvriv = w / iklev;            // kuvia rivillä
        int riveja = 10 / kuvriv;    // näin monta kokonaista riviä
        int vajaa = 10 - kuvriv * riveja;  // vajaalla rivillä näin monta kuvaa
        if (vajaa > 0)
            riveja++;
        int kokokork = Math.max(540, riveja * ikkor);  // pystysuunnassa kuvat vievät tilaa
        return kokokork;
    }

    // -------------------------------------
    // 6.5.2020   KM03
    // tehdään kuvalle context menu
    private void teeMenu(Label ab)
    {
        Menu menu = new Menu(ab);
        MenuItem item = new MenuItem(menu, SWT.PUSH);
        item.setText("Näytä kuva");
        item.addSelectionListener(new SelectionAdapter()
        {
            @Override
            public void widgetSelected(SelectionEvent e)
            {
                    System.out.println("Näytä kuva idKoh="+ab.getData("idkoh"));
            }
        });
        item = new MenuItem(menu, SWT.PUSH);
        item.setText("Kasvin tiedot");
        item.addSelectionListener(new SelectionAdapter()
        {
            @Override
            public void widgetSelected(SelectionEvent e)
            {
                    System.out.println("Kasvin tiedot anna kohteelle idKoh="+ab.getData("idkoh"));
            }
        });
        item = new MenuItem(menu, SWT.PUSH);
        item.setText("Kopioi kuva työpöydälle");
        item.addSelectionListener(new SelectionAdapter()
        {
            @Override
            public void widgetSelected(SelectionEvent e)
            {
                    System.out.println("Kopioi kuva työpöydälle idKoh="+ab.getData("idkoh"));
            }
        });
        ab.setMenu(menu);
    }

    // --------------------------------
    // 9.5.2020    KM97
    protected void createContents()
    {
        shell = new Shell();
        shell.addControlListener(new ControlAdapter()
        {
            @Override
            public void controlResized(ControlEvent e)
            {
                if (!valmis)
                    return;
                sc.setMinSize(445, scrollKorkea());  // width, height
            }
        });
        if (macissa)
            shell.setSize(840, 540);  
        else
            shell.setSize(790, 540);
        shell.setText("SWT Application");
        shell.setLayout(new FormLayout());
       
        Composite composite = new Composite(shell, SWT.NONE);
        FormData fd_composite = new FormData();
        fd_composite.bottom = new FormAttachment(0, 29);
        fd_composite.right = new FormAttachment(100, 0);
        fd_composite.top = new FormAttachment(0);
        fd_composite.left = new FormAttachment(0);
        composite.setLayoutData(fd_composite);

        Label lblNewLabel = new Label(composite, SWT.NONE);
        lblNewLabel.setBounds(140, 8, 340, 14);
        lblNewLabel.setText("Kuvilla context menu");

        Button btnPoistu = new Button(composite, SWT.NONE);
        btnPoistu.addSelectionListener(new SelectionAdapter()
        {
            @Override
            public void widgetSelected(SelectionEvent e)
            {
                shell.close();
            }
        });
        btnPoistu.setBounds(10, 2, 94, 25);
        btnPoistu.setText("Poistu");
       
        sc = new ScrolledComposite(shell, SWT.BORDER | SWT.V_SCROLL);
        FormData fd_sc = new FormData();
        fd_sc.top = new FormAttachment(composite, 0, SWT.BOTTOM);
        fd_sc.bottom = new FormAttachment(100, -2);
        fd_sc.right = new FormAttachment(composite, 0, SWT.RIGHT);
        fd_sc.left = new FormAttachment(0);
        sc.setLayoutData(fd_sc);

        c1 = new Composite(sc, SWT.NONE);
        RowLayout rowLayout = new RowLayout(SWT.HORIZONTAL);
        rowLayout.spacing = 3;
        c1.setLayout(rowLayout);

        sc.setContent(c1);
        sc.setExpandHorizontal(true);
        sc.setExpandVertical(true);
    }
}



-----------------------------------
(sivua muokattu 10.5.2020)