Advertisement
Guest User

Untitled

a guest
Dec 5th, 2016
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.01 KB | None | 0 0
  1. package ztp08;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Dimension;
  5. import java.awt.Graphics;
  6. import java.awt.Point;
  7. import java.awt.event.MouseAdapter;
  8. import java.awt.event.MouseEvent;
  9. import java.util.Iterator;
  10. import javax.swing.JFrame;
  11. import javax.swing.JPanel;
  12.  
  13. // pojedynczy kafelek
  14. class Tile {
  15.  
  16. // schowek na wartość logiczną
  17. private boolean value = false;
  18. // kolory
  19. private static final Color on = new Color(0xffd700),
  20. off = new Color(0x1e90ff);
  21.  
  22. // odczyt koloru
  23. public Color getColor() {
  24. return value ? on : off;
  25. }
  26.  
  27. //zmiana koloru
  28. public void flip() {
  29. value = !value;
  30. }
  31. }
  32.  
  33. //macierz kafelków
  34. class Kafelki extends JPanel {
  35.  
  36. private Tile[][] matrix;
  37. private int tilesize;
  38. // kafelek podświetlony (myszką)
  39. private int hx = -1, hy = -1;
  40.  
  41. // inicjalizacja macierzy
  42. public Kafelki(int cols, int rows, int tilesize) {
  43. this.setPreferredSize(new Dimension(cols * tilesize, rows * tilesize));
  44. this.tilesize = tilesize;
  45. matrix = new Tile[rows][cols];
  46. for (int i = 0; i < matrix.length; ++i) {
  47. for (int j = 0; j < matrix[i].length; ++j) {
  48. matrix[i][j] = new Tile();
  49. }
  50. }
  51. }
  52.  
  53. // rysowanie macierzy (oraz jednego podświetlonego)
  54. @Override
  55. public void paintComponent(Graphics g) {
  56. super.paintComponent(g);
  57. for (int i = 0; i < matrix.length; ++i) {
  58. for (int j = 0; j < matrix[i].length; ++j) {
  59. if (i == hy && j == hx) {
  60. g.setColor(matrix[i][j].getColor().brighter());
  61. } else {
  62. g.setColor(matrix[i][j].getColor());
  63. }
  64. g.fillRect(j * tilesize, i * tilesize + 1, tilesize - 1, tilesize - 1);
  65. }
  66. }
  67. }
  68.  
  69. // podświetl
  70. public void highlight(int x, int y) {
  71. hx = x;
  72. hy = y;
  73. repaint();
  74. }
  75.  
  76. public Tile[][] getMatrix()
  77. {
  78. return matrix;
  79. }
  80. // trzy poniższe metody znikną w finalnej wersji
  81. // public int getRows() {
  82. // return matrix.length;
  83. // }
  84. //
  85. // public int getCols() {
  86. // return matrix[0].length;
  87. // }
  88. //
  89. // public Tile getAt(int row, int col) {
  90. // return matrix[row][col];
  91. // }
  92.  
  93. // za to pojawi się metoda pobierająca iterator
  94. // public Iterator<Tile> iterator( ...
  95. }
  96.  
  97.  
  98. abstract class IteratorKafeleki implements Iterator
  99. {
  100. private Kafelki kafelki;
  101. private Point currentItem;
  102.  
  103. public void setCurrentItem(int x, int y)
  104. {
  105. this.currentItem.x = x;
  106. this.currentItem.y = y;
  107. }
  108.  
  109. @Override
  110. public boolean hasNext() {
  111. Tile[][] matrix = kafelki.getMatrix();
  112. int x = matrix.length;
  113. int y = matrix[0].length;
  114. if (currentItem.x == x && currentItem.y == y)
  115. return false;
  116. else
  117. return true;
  118. }
  119.  
  120. @Override
  121. public Object next() {
  122. throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
  123. }
  124.  
  125. @Override
  126. public void remove() {
  127. throw new UnsupportedOperationException("Not supported yet.");
  128. }
  129. }
  130.  
  131. class IteratorLine extends IteratorKafeleki
  132. {
  133. private Kafelki kafelki;
  134. private Point currentItem;
  135.  
  136. public IteratorLine (Kafelki kafelki)
  137. {
  138. this.kafelki = kafelki;
  139. setCurrentItem(0,0);
  140. }
  141.  
  142. @Override
  143. public Tile next()
  144. {
  145. if (this.hasNext())
  146. {
  147. Tile[][] matrix = kafelki.getMatrix();
  148. int x = matrix.length;
  149. int y = matrix[0].length;
  150. if (currentItem.x < x)
  151. {
  152. currentItem.x++;
  153. return matrix[currentItem.x][currentItem.y];
  154. }
  155. else if (currentItem.y < y)
  156. {
  157. currentItem.x = 0;
  158. currentItem.y++;
  159. return matrix[currentItem.x][currentItem.y];
  160. }
  161. else
  162. throw new UnsupportedOperationException("Not supported yet.");
  163. }
  164. else
  165. throw new UnsupportedOperationException("Not supported yet.");
  166. }
  167.  
  168. // @Override
  169. // public boolean hasNext() {
  170. // Tile[][] matrix = kafelki.getMatrix();
  171. // int x = matrix.length;
  172. // int y = matrix[0].length;
  173. // if (currentItem.x == x && currentItem.y == y)
  174. // return false;
  175. // else
  176. // return true;
  177. //// bool has = false;
  178. //// Tile[][] matrix = kafelki.getMatrix();
  179. //// try {
  180. //// Tile t = matrix[currentItem.x][currentItem.y];
  181. //// has = true;
  182. //// }
  183. //// catch(Exception ex)
  184. //// {
  185. //// has = false;
  186. //// }
  187. //// finally {
  188. //// return has;
  189. //// }
  190. // }
  191. }
  192.  
  193. // ten wątek nie wykorzystuje iteratora
  194. class Watek implements Runnable {
  195. private Kafelki p;
  196. private Iterator iterator;
  197. private int x, y;
  198.  
  199. // x, y to początkowa pozycja do iteracji
  200. public Watek(Iterator iter, int x, int y) {
  201. this.iterator = iter;
  202. //this.p = k;
  203. this.x = x;
  204. this.y = y;
  205. }
  206.  
  207. public void run() {
  208. // klasyczna podwójna pętla do iteracji
  209. // tutaj kontrolujemy kolejność odwiedzin
  210. // zostanie to zastąpione pętlą z użyciem iteratora
  211. while(iterator.hasNext())
  212. {
  213.  
  214. p.repaint();
  215. try {
  216. Thread.currentThread().sleep(100);
  217. } catch (InterruptedException e) {
  218. e.printStackTrace();
  219. }
  220. }
  221.  
  222. }
  223. }
  224.  
  225. public class Ztp08 {
  226.  
  227. static final int TILESIZE = 40;
  228.  
  229. public static void main(String[] args) {
  230.  
  231. // konstruowanie okna
  232. JFrame frame = new JFrame("Iterator");
  233. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  234. final Kafelki kafelki = new Kafelki(16, 9, TILESIZE);
  235. frame.getContentPane().add(kafelki);
  236. frame.pack();
  237. frame.setVisible(true);
  238.  
  239. // reakcja na kliknięcie uruchomienie wątku z iteracją
  240. kafelki.addMouseListener(new MouseAdapter() {
  241.  
  242. @Override
  243. public void mouseClicked(MouseEvent e) {
  244. int x = e.getX() / TILESIZE;
  245. int y = e.getY() / TILESIZE;
  246. new Thread(new Watek(new IteratorLine(kafelki), x, y)).start();
  247. }
  248. });
  249. // reakcja na ruch - podświetlenie wskazanego kafelka
  250. kafelki.addMouseMotionListener(new MouseAdapter() {
  251.  
  252. @Override
  253. public void mouseMoved(MouseEvent e) {
  254. int x = e.getX() / TILESIZE;
  255. int y = e.getY() / TILESIZE;
  256. kafelki.highlight(x, y);
  257. }
  258. });
  259. }
  260. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement