1   package demo9;
2   
3   import javax.swing.JPanel;
4   
5   import fi.jyu.mit.graphics.Bitmap;
6   import fi.jyu.mit.graphics.SpacePanel;
7   import java.awt.BorderLayout;
8   import javax.swing.BoxLayout;
9   import javax.swing.JButton;
10  import java.awt.event.ActionListener;
11  import java.awt.event.ActionEvent;
12  import static demo9.Pystyviivat.*;
13  
14  import javax.swing.ButtonGroup;
15  import javax.swing.JTextField;
16  import javax.swing.JRadioButton;
17  import javax.swing.SwingConstants;
18  import javax.swing.JCheckBox;
19  import javax.swing.border.BevelBorder;
20  import javax.swing.JLabel;
21  import java.awt.Color;
22  
23  /**
24   * Paneeli, jossa on kaksi kuvaa.  Ensimmäinen haetaan netistä käyttäjän valitsemasta
25   * osoitteesta ja toinen lasketaan konvoloimalla käyttäjän valitsemilla matriiseilla.
26   * @author vesal
27   * @version 6.11.2010
28   */
29  public class KonvoluutioPanel extends JPanel {
30  
31      private static final long serialVersionUID = 1L;
32  
33      private SpacePanel spacePanelAlkup = new SpacePanel();
34      private SpacePanel spacePanelMuunnettu = new SpacePanel();
35      private JTextField editURL1;
36      private JTextField editURL2;
37      private JRadioButton rbURL1 = new JRadioButton("1");
38      private JRadioButton rbURL2 = new JRadioButton("2");
39      private PanelMatriisi[] panelMatriisi = new PanelMatriisi[5];
40      private PanelSumma panelSumma1 = new PanelSumma();
41      private PanelSumma panelSumma2 = new PanelSumma();
42      private JLabel labelError = new JLabel("");
43      
44      
45      /**
46       * Create the panel.
47       */
48      public KonvoluutioPanel() {
49          setLayout(new BorderLayout(0, 0));
50          
51          JPanel panelKuvat = new JPanel();
52          add(panelKuvat, BorderLayout.CENTER);
53          panelKuvat.setLayout(new BoxLayout(panelKuvat, BoxLayout.X_AXIS));
54          
55          panelKuvat.add(spacePanelAlkup);
56          
57          panelKuvat.add(spacePanelMuunnettu);
58          
59          JPanel panelMuut = new JPanel();
60          add(panelMuut, BorderLayout.SOUTH);
61          
62          JButton buttonTee = new JButton("Aja muunnokset");
63          buttonTee.setToolTipText("Suorita valitut muunnokset");
64          buttonTee.setMnemonic('A');
65          buttonTee.addActionListener(new ActionListener() {
66              public void actionPerformed(ActionEvent e) {
67                 vaihdaKuva();                
68              }
69          });
70          panelMuut.setLayout(new BorderLayout(0, 0));
71          panelMuut.add(buttonTee, BorderLayout.SOUTH);
72          
73          JPanel panelMatriisit = new JPanel();
74          panelMuut.add(panelMatriisit, BorderLayout.NORTH);
75          panelMatriisit.setLayout(new BoxLayout(panelMatriisit, BoxLayout.X_AXIS));
76          
77          JPanel panelSummat = new JPanel();
78          panelSummat.setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
79          panelMuut.add(panelSummat, BorderLayout.CENTER);
80          
81          JLabel lblLaskeSummat = new JLabel("Laske summat: ");
82          panelSummat.add(lblLaskeSummat);
83          panelSumma1.setToolTipText("Kertoimet 1. yhteenlaskua varten");
84          
85          panelSummat.add(panelSumma1);
86          panelSumma2.setToolTipText("Kertoimet 2. yhteenlaskua varten");
87          panelSummat.add(panelSumma2);
88  
89          for ( int i=0; i<panelMatriisi.length; i++) {
90              panelMatriisi[i] = new PanelMatriisi();
91              panelMatriisit.add(panelMatriisi[i]);
92          }
93          
94          JPanel panelURLS = new JPanel();
95          add(panelURLS, BorderLayout.NORTH);
96          panelURLS.setLayout(new BorderLayout(0, 0));
97          
98          JPanel panelURL1 = new JPanel();
99          panelURLS.add(panelURL1, BorderLayout.NORTH);
100         panelURL1.setLayout(new BorderLayout(0, 0));
101         
102         editURL1 = new JTextField();
103         panelURL1.add(editURL1);
104         editURL1.setToolTipText("Kuvan osoite");
105         editURL1.setText("http://users.jyu.fi/~vesal/kurssit/ohjelmointi1/2010/demot/vast/demo9/vesa.jpg");
106         editURL1.setColumns(10);
107         
108         rbURL1.setSelected(true);
109         rbURL1.setHorizontalAlignment(SwingConstants.TRAILING);
110         panelURL1.add(rbURL1, BorderLayout.WEST);
111         
112         JPanel panelURL2 = new JPanel();
113         panelURLS.add(panelURL2, BorderLayout.CENTER);
114         panelURL2.setLayout(new BorderLayout(0, 0));
115         
116         editURL2 = new JTextField();
117         editURL2.setToolTipText("Kuvan osoite");
118         editURL2.setText("http://users.jyu.fi/~vesal/kurssit/ohjelmointi1/2010/demot/vast/demo9/viivat.png");
119         editURL2.setColumns(10);
120         panelURL2.add(editURL2);
121         
122         rbURL2.setHorizontalAlignment(SwingConstants.TRAILING);
123         panelURL2.add(rbURL2, BorderLayout.WEST);
124 
125         ButtonGroup bgURLs = new ButtonGroup();
126         bgURLs.add(rbURL1);
127         bgURLs.add(rbURL2);
128         
129         JPanel panel = new JPanel();
130         panelURLS.add(panel, BorderLayout.SOUTH);
131         labelError.setForeground(Color.RED);
132         
133         panel.add(labelError);
134         alusta();
135     }
136     
137     
138     private void alusta() {
139         panelMatriisi[1].setText("-1 -1 -1 -1 -1 \n-1 -1 -1 -1 -1 \n-1 -1 24 -1 -1 \n-1 -1 -1 -1 -1 \n-1 -1 -1 -1 -1");  // Laplacian
140         panelMatriisi[2].setText("-1  0  1\n-2  0  2\n-1  0  1"); // sobolev
141         panelMatriisi[3].setText(" 1  1  1\n 1  1  1\n 1  1  1"); // keskiarvo
142         panelMatriisi[4].setText("-1 -1 -1\n-1 16 -1\n-1 -1 -1"); // terävöitys  
143         panelMatriisi[3].setValue(5);
144         
145         panelSumma2.setB(1.0);
146     }
147     
148     
149     /**
150      * Haetaan kuva netistä ja lasketaan konvoluutiot
151      */
152     public void vaihdaKuva() {
153         labelError.setText("");
154         
155         spacePanelAlkup.removeAll();
156         spacePanelMuunnettu.removeAll();
157         
158         Bitmap bm;
159         String url = editURL1.getText();
160         if ( rbURL2.isSelected() ) url = editURL2.getText();
161         try {
162             
163           bm = new Bitmap(0, 0, url); 
164         } catch (Exception e) {
165             labelError.setText(e.getMessage());
166             return;
167         }  
168         spacePanelAlkup.add(bm);
169       
170         int[][] kuva = bm.getData();
171         int[][] kuva2 = muunna(kuva, new int[][]{{1}});
172         
173         for (int matindex=0; matindex<panelMatriisi.length; matindex++) {
174             int[][] painot = panelMatriisi[matindex].getMatriisi();
175             int lkm = panelMatriisi[matindex].getValue();
176             for (int i = 0; i < lkm; i++) {
177               kuva2 = muunna(kuva2, painot);
178             }
179         }
180 
181         if ( panelSumma1.isSelected() ) {
182             kuva2 = summa(kuva, kuva2, panelSumma1.getA(), panelSumma1.getB()); 
183         }
184         
185         if ( panelSumma2.isSelected() ) {
186             kuva2 = summa(kuva, kuva2, panelSumma2.getA(), panelSumma2.getB()); 
187         }
188         
189         Bitmap bm2 = new Bitmap(0, 0, bm);
190         bm2.setData(0, 0, kuva2);
191         spacePanelMuunnettu.add(bm2);
192     }
193 }
194