1   package demo9;
2   
3   import javax.swing.JPanel;
4   import java.awt.BorderLayout;
5   import javax.swing.JTextArea;
6   import javax.swing.JSpinner;
7   import javax.swing.SpinnerNumberModel;
8   import javax.swing.border.BevelBorder;
9   
10  import fi.jyu.mit.ohj2.Mjonot;
11  import java.awt.Font;
12  
13  
14  /**
15   * Paneeli, jossa on konvoluutiomatriisi, jota voi muokata
16   * @author vesal
17   * @version 6.11.2010
18   */
19  public class PanelMatriisi extends JPanel {
20      private static final long serialVersionUID = 1L;
21  
22      private final JPanel panelValinnat = new JPanel();
23      private final JTextArea textMatriisi = new JTextArea();
24      private final JSpinner spinner = new JSpinner();
25  
26      /**
27       * Create the panel.
28       */
29      public PanelMatriisi() {
30          setBorder(new BevelBorder(BevelBorder.LOWERED, null, null, null, null));
31          setLayout(new BorderLayout(0, 0));
32          textMatriisi.setFont(new Font("Monospaced", textMatriisi.getFont().getStyle(), 13));
33          textMatriisi.setRows(3);
34          textMatriisi.setText("-1  0  1\r\n-1  0  1\r\n-1  0  1");
35          
36          add(textMatriisi, BorderLayout.CENTER);
37          
38          add(panelValinnat, BorderLayout.SOUTH);
39          spinner.setModel(new SpinnerNumberModel(0, 0, 50, 1));
40          
41          panelValinnat.add(spinner);
42  
43      }
44      
45  
46      /**
47       * Palautetaan merkkijonotaulukosta saatava kokonaislukumatriisi.
48       * @param lines josta matriisi otetaan.  1. rivin pituus määrää sarakkeiden määrän
49       * @return taulukosta saatu matriisi.
50       * @example
51       * <pre name="test">
52       *   int[][] m = getMatriisi(new String[]{"1 -2 3 4","5","6 7 8 9 10 11"});
53       *   m.length === 3; m[0].length === 4; m[2].length === 4;
54       *   m[0][0] === 1; m[0][1] === -2; m[0][2] === 3; m[0][3] === 4;
55       *   m[1][0] === 5; m[1][1] ===  0; m[1][2] === 0; m[1][3] === 0;
56       *   m[2][0] === 6; m[2][1] ===  7; m[2][2] === 8; m[2][3] === 9;
57       *   
58       *   int[][] m2 = getMatriisi(new String[0]);
59       *   m2.length === 1; m2[0].length === 1;
60       *   m2[0][0] === 1;
61       * </pre>
62       * 
63       */
64      public static int[][] getMatriisi(String[] lines) {
65          int n = 0; // Selvitetään rivien määrä
66          final String erottimet = "[ \t,;:]+"; 
67          for (String line : lines) {
68              if ( line.trim().length() == 0 ) break;
69              n++;
70          }
71          if ( n == 0 ) return new int[][]{{1}};
72          
73          String line = lines[0];
74          String[] items = line.split(erottimet);
75          int m = items.length;
76  
77          int[][] tulos = new int[n][m];
78  
79          for (int iy=0; iy<n; iy++) {
80               String[] cols = lines[iy].split(erottimet);
81               for (int ix = 0; ix < m; ix++) {
82                   if ( ix >= cols.length) break;
83                   tulos[iy][ix] = Mjonot.erotaInt(cols[ix], 0);
84               }
85          }
86          
87          return tulos;
88      }
89  
90      
91      /**
92       * Palautetaan jonosta saatava kokonaislukumatriisi.
93       * Rivit erotetaan \n merkillä.  
94       * @param jono josta matriisi otetaan.  1. rivin pituus määrää sarakkeiden määrän
95       * @return jonosta saatu matriisi.
96       * @example
97       * <pre name="test">
98       *   int[][] m = getMatriisi("1,-2\n3  4\na\t6\n\n");
99       *   m.length === 3;
100      *   m[0][0] === 1; m[0][1] === -2;
101      *   m[1][0] === 3; m[1][1] === 4;
102      *   m[2][0] === 0; m[2][1] === 6;
103      *   int[][] m2 = getMatriisi("\n\n");
104      *   
105      *   m2.length === 1; m2[0].length === 1;
106      *   m2[0][0] === 1;
107      * </pre>
108      */
109     public static int[][] getMatriisi(String jono) {
110         return getMatriisi(jono.split("\n"));
111     }
112 
113     
114     /**
115      * Palauatetaan paneelissa oleva konvoluutiomatriisi
116      * @return konvoluttiomatriisi
117      */
118     public int[][] getMatriisi() {
119         return getMatriisi(textMatriisi.getText());
120     }
121 
122 
123     /**
124      * @return matriisille valittu toistokertojen määrä
125      */
126     public int getValue() {
127         return (Integer)spinner.getValue(); 
128     }
129 
130 
131     /**
132      * Asetetaan konvoluutiomatriisin toistokertojen määrä
133      * @param n monestiko konvoluutiota toistetaan
134      */
135     public void setValue(int n) {
136         spinner.setValue(n);
137         
138     }
139 
140 
141     /**
142      * Asetetaan konvoluutiomatriisin sisältö yhdestä merkkijonosta jossa rivit erotettu \n-merkeillä.
143      * @param jono uusi matriisin arvo
144      */
145     public void setText(String jono) {
146         textMatriisi.setText(jono);
147     } 
148     
149 }
150