Advertisement
Guest User

Rogal

a guest
Jan 23rd, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 16.22 KB | None | 0 0
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.util.*;
  4. import javax.swing.*;
  5. import javax.swing.table.DefaultTableModel;
  6.  
  7. /*=======  TU PROSZE SIE PODPISAC ==============================
  8.  *      Imie:
  9.  *  Nazwisko:
  10.  *Nr indeksu:
  11.  *     Grupa:  18 Grudnia 2018, wtNP 11:15 np. Pn/P 9:15
  12.  *==============================================================
  13.  */
  14.  
  15. class Circle implements Comparable<Circle> {
  16.     private int x, y;
  17.     private String name;
  18.    
  19.     public Circle(String name, int x, int y){
  20.         this.name = name;
  21.         this.x = x;
  22.         this.y = y;
  23.     }
  24.    
  25.     public int getX() {
  26.         return x;
  27.     }
  28.    
  29.     public int getY() {
  30.         return y;
  31.     }
  32.  
  33.     public String getName() {
  34.         return name;
  35.     }
  36.  
  37.     public void move(int dx, int dy){
  38.         x+=dx;
  39.         y+=dy;
  40.     }
  41.  
  42.     public void draw(Graphics g){
  43.         g.drawOval(x-25, y-25, 50, 50);
  44.         g.drawString(name, x-15, y);
  45.     }
  46.  
  47.     @Override
  48.     public int compareTo(Circle circle) {
  49.         return this.name.compareTo(circle.getName());
  50.     }
  51.  
  52.  
  53.  
  54.     // Tu proszę dopisać brakujące metody, które są niezbędne,
  55.     // by obiekty klasy Circle mogły być przechowywane w kolekcji.
  56.  
  57.    
  58.    
  59. } // koniec klasy Circle
  60.  
  61.  
  62.  
  63. import java.awt.*;
  64. import java.awt.event.*;
  65. import java.util.*;
  66. import javax.swing.*;
  67. import javax.swing.table.DefaultTableModel;
  68.  
  69. /*=======  TU PROSZE SIE PODPISAC ==============================
  70.  *      Imie:
  71.  *  Nazwisko:
  72.  *Nr indeksu:
  73.  *     Grupa:  18 Grudnia 2018, wtNP 11:15 np. Pn/P 9:15
  74.  *==============================================================
  75.  */
  76.  
  77. class MyPanel extends JPanel implements MouseListener, MouseMotionListener, KeyListener{
  78.  
  79.     private static final long serialVersionUID = 1L;
  80.    
  81.     protected TreeSet<Circle> circleSet;
  82.    
  83.     protected JButton buttonAddRandom;
  84.     protected JButton buttonRemoveAll;
  85.     protected ViewCollection viewCollection;
  86.    
  87.     private int mouseX = 0;
  88.     private int mouseY = 0;
  89.    
  90.     public MyPanel() {
  91.         this.addMouseListener(this);
  92.         this.addMouseMotionListener(this);
  93.         this.addKeyListener(this);
  94.         this.setFocusable(true);
  95.         this.requestFocus();
  96.        
  97.         circleSet = new TreeSet<Circle>();
  98.        
  99.         buttonAddRandom = new JButton("Dodaj losowe koło");
  100.         buttonRemoveAll = new JButton("Usuń koła");
  101.         buttonAddRandom.addActionListener(new ActionListener() {
  102.             public void actionPerformed(ActionEvent e){
  103.                 String name = JOptionPane.showInputDialog("Podaj nazwę koła");
  104.                 if(name == null || name.isEmpty()) return;
  105.                 Circle circleNew = new Circle(name, (int)(Math.random()*500), (int)(Math.random()*500));
  106.                 circleSet.add(circleNew);
  107.                 refresh();
  108.         }});
  109.         buttonRemoveAll.addActionListener(new ActionListener() {
  110.             public void actionPerformed(ActionEvent e){
  111.                 circleSet.clear();
  112.                 refresh();
  113.         }});
  114.        
  115.         viewCollection = new ViewCollection(circleSet);
  116.        
  117.         this.add(buttonAddRandom);
  118.         this.add(buttonRemoveAll);
  119.         this.add(viewCollection);
  120.        
  121.     }
  122.    
  123.       @Override
  124.       public void paintComponent(Graphics g){
  125.           super.paintComponent(g);
  126.           for(Circle circle : circleSet) {
  127.                 circle.draw(g);
  128.       }}
  129.      
  130.    
  131.     protected void refresh()
  132.     {
  133.         viewCollection.refresh();
  134.         repaint();
  135.     }
  136.    
  137.     @Override
  138.     public void keyPressed(KeyEvent event) {
  139.         if(event.getKeyCode() == KeyEvent.VK_DELETE) {
  140.             circleSet.clear();
  141.             refresh();
  142.         }
  143.     }
  144.  
  145.     @Override
  146.     public void keyReleased(KeyEvent event) {
  147.     }
  148.  
  149.     @Override
  150.     public void keyTyped(KeyEvent event) {
  151.         if(event.getKeyChar() == 'c' || event.getKeyChar() == 'C') {
  152.             String name = JOptionPane.showInputDialog("Podaj nazwę koła");
  153.             if(name == null || name.isEmpty()) return;
  154.             Circle circleNew = new Circle(name, (int)(Math.random()*500), (int)(Math.random()*500));
  155.             circleSet.add(circleNew);
  156.             refresh();
  157.         }
  158.     }
  159.  
  160.     @Override
  161.     public void mouseDragged(MouseEvent event) {
  162.         for(Circle circle : circleSet) {
  163.             circle.move((int)(event.getX() - mouseX), (int)(event.getY() - mouseY));
  164.         }
  165.         mouseX = (int)this.getMousePosition().getX();
  166.         mouseY = (int)this.getMousePosition().getY();
  167.         refresh();
  168.     }
  169.  
  170.     @Override
  171.     public void mouseMoved(MouseEvent event) {
  172.         mouseX = (int)this.getMousePosition().getX();
  173.         mouseY = (int)this.getMousePosition().getY();
  174.     }
  175.  
  176.     @Override
  177.     public void mouseClicked(MouseEvent event) {
  178.         String name = JOptionPane.showInputDialog("Podaj nazwę koła");
  179.         if(name == null || name.isEmpty()) return;
  180.         Circle circleNew = new Circle(name, event.getX(), event.getY());
  181.         circleSet.add(circleNew);
  182.         refresh();
  183.     }
  184.  
  185.     @Override
  186.     public void mouseEntered(MouseEvent arg0) {
  187.     }
  188.  
  189.     @Override
  190.     public void mouseExited(MouseEvent arg0) {
  191.     }
  192.  
  193.     @Override
  194.     public void mousePressed(MouseEvent event) {
  195.     }
  196.  
  197.     @Override
  198.     public void mouseReleased(MouseEvent arg0) {
  199.     }
  200.    
  201.    
  202. } // koniec klasy MyPanel
  203.  
  204.  
  205.  
  206. import java.awt.*;
  207. import java.awt.event.*;
  208. import java.util.*;
  209. import javax.swing.*;
  210. import javax.swing.table.DefaultTableModel;
  211.  
  212. /*=======  TU PROSZE SIE PODPISAC ==============================
  213.  *      Imie:
  214.  *  Nazwisko:
  215.  *Nr indeksu:
  216.  *     Grupa:  18 Grudnia 2018, wtNP 11:15 np. Pn/P 9:15
  217.  *==============================================================
  218.  */
  219.  
  220. public class MyWindow extends JFrame{
  221.  
  222.     private static final long serialVersionUID = 1L;
  223.  
  224.     protected JMenuBar menuBarMain;
  225.    
  226.     protected JMenu menuOptions;
  227.    
  228.     protected JMenuItem menuItemAuthor;
  229.     protected JMenuItem menuItemDescription;
  230.     protected JMenuItem menuItemExit;
  231.    
  232.     private static final String AUTHOR =
  233.             "       Imie:\r\n" +
  234.             "   Nazwisko:\r\n" +
  235.             " Nr indeksu:\r\n" +
  236.             "      Grupa:  18 Grudnia 2018, wtNP 11:15 np. Pn/P 9:15\r\n";
  237.     private static final String OPIS_PROGRAMU =
  238.             "KLAWIATURA:\n" +
  239.             " * strzałki ==> wolne przesuwanie kółek (o 1 piksel)\n" +
  240.             " * Shift+strzałki ==> szybkie przesuwanie kółek (o 10 pikseli)\n" +
  241.             " * Delete ==> kasowanie wszystkich kółek\n" +
  242.             " * C, c -> dodawanie nowego kółko w losowym miejscu\n\n" +
  243.             "MYSZKA:\n" +
  244.             " * kilknięcie ==> dodanie nowego kółka w miejscu kursora myszki\n" +
  245.             " * przeciąganie ==> przesuwanie wszystkich kółek";
  246.    
  247.     public static void main(String[] args) {
  248.         new MyWindow();
  249.  
  250.         // Tu proszę dopisać instrukcje zgodnie z wytycznymi zadania 8
  251.     }
  252.    
  253.     public MyWindow() {
  254.         this.setSize(500, 500);
  255.         this.setDefaultCloseOperation(EXIT_ON_CLOSE);
  256.         this.setResizable(false);
  257.         this.setTitle("Filip Wanat");
  258.        
  259.         MyPanel panelMain = new MyPanel();
  260.         this.setContentPane(panelMain);
  261.        
  262.         menuBarMain = new JMenuBar();
  263.        
  264.         menuOptions = new JMenu();
  265.         menuOptions.setText("Opcje");
  266.        
  267.         menuItemAuthor = new JMenuItem();
  268.         menuItemDescription = new JMenuItem();
  269.         menuItemExit = new JMenuItem();
  270.         menuItemAuthor.setText("Autor");
  271.         menuItemDescription.setText("Opis programu");
  272.         menuItemExit.setText("Zakończ");
  273.         menuItemAuthor.addActionListener(new ActionListener() {
  274.             public void actionPerformed(ActionEvent e) {
  275.                 JOptionPane.showMessageDialog(null, AUTHOR);
  276.         }});
  277.         menuItemDescription.addActionListener(new ActionListener() {
  278.             public void actionPerformed(ActionEvent e) {
  279.                 JOptionPane.showMessageDialog(null, OPIS_PROGRAMU);
  280.         }});
  281.         menuItemExit.addActionListener(new ActionListener() {
  282.             public void actionPerformed(ActionEvent e) {
  283.                 System.exit(0);
  284.         }});
  285. ;
  286.         menuItemDescription.setText("Opis programu");
  287.         menuItemExit.setText("Zakończ");
  288.        
  289.         menuOptions.add(menuItemAuthor);
  290.         menuOptions.add(menuItemDescription);
  291.         menuOptions.add(menuItemExit);
  292.        
  293.         menuBarMain.add(menuOptions);
  294.        
  295.         this.setJMenuBar(menuBarMain);
  296.        
  297.         this.setVisible(true);
  298.     }
  299.  
  300.    
  301.  
  302.    
  303. }  // koniec klasy MyWindow
  304.  
  305.  
  306.  
  307. import java.awt.*;
  308. import java.awt.event.*;
  309. import java.util.*;
  310. import javax.swing.*;
  311. import javax.swing.table.DefaultTableModel;
  312.  
  313. /*=======  TU PROSZE SIE PODPISAC ==============================
  314.  *      Imie:
  315.  *  Nazwisko:
  316.  *Nr indeksu:
  317.  *     Grupa:  18 Grudnia 2018, wtNP 11:15 np. Pn/P 9:15
  318.  *==============================================================
  319.  */
  320.  
  321. //KLASA POMOCNICZA DO ZADANIA NR 8
  322. class Printer {
  323.  
  324.     volatile int id = 0; // id Producenta, który ostatnio korzystał z drukarki
  325.     int nr = 0; // numer zadania (automatycznie incrementowany).
  326.  
  327.     // Proszę zmodyfikować metodę print zgodnie z wytycznymi do zadania 8.
  328.     void print(String text, int id) {
  329.  
  330.             System.out.println(++nr + ":  " + text);
  331.  
  332.        
  333.     }
  334.  
  335. } // Koniec klasy Printer
  336.  
  337.  
  338.  
  339.  
  340. import java.awt.*;
  341. import java.awt.event.*;
  342. import java.util.*;
  343. import javax.swing.*;
  344. import javax.swing.table.DefaultTableModel;
  345.  
  346. /*=======  TU PROSZE SIE PODPISAC ==============================
  347.  *      Imie:
  348.  *  Nazwisko:
  349.  *Nr indeksu:
  350.  *     Grupa:  18 Grudnia 2018, wtNP 11:15 np. Pn/P 9:15
  351.  *==============================================================
  352.  */
  353.  
  354. //KLASA POMOCNICZA DO ZADANIA NR 8
  355. //W TEJ KLASIE NIE TRZEBA NIC MODYFIKOWAĆ!!!
  356. class Producer extends Thread
  357. {   Printer printer;
  358.     String text;
  359.     int id;
  360.    
  361.     public Producer(Printer printer, String text, int id) {
  362.         this.printer = printer;
  363.         this.text = text;
  364.         this.id = id;
  365.     }
  366.    
  367.     @Override
  368.     public void run() {
  369.         while (true){
  370.             printer.print(text, id);
  371.             try {
  372.                 sleep(500 + (long)(Math.random()*3000));
  373.             } catch (InterruptedException e) { }
  374.         }
  375.     }  
  376. }  // koniec klasy Producer
  377.  
  378.  
  379.  
  380.  
  381. import java.awt.*;
  382. import java.awt.event.*;
  383. import java.util.*;
  384. import javax.swing.*;
  385. import javax.swing.table.DefaultTableModel;
  386.  
  387. /*=======  TU PROSZE SIE PODPISAC ==============================
  388.  *      Imie:
  389.  *  Nazwisko:
  390.  *Nr indeksu:
  391.  *     Grupa:  18 Grudnia 2018, wtNP 11:15 np. Pn/P 9:15
  392.  *==============================================================
  393.  */
  394.  
  395. class ViewCollection extends JScrollPane {
  396.     private static final long serialVersionUID = 1L;
  397.  
  398.     // W TEJ KLASIE NIE TRZEBA NIC MODYFIKOWAĆ !!!
  399.    
  400.     private JTable table;
  401.     private DefaultTableModel tableModel;
  402.     Collection<Circle> collection;
  403.  
  404.     /* Do konstruktora należy przekazać referencję
  405.      * na kolekcję, której zawartość ma być wyświetlana
  406.      * na panelu
  407.      */
  408.     ViewCollection(Collection<Circle> collection) {
  409.         String[] header = { "Nazwa", " x ", " y " };
  410.         tableModel = new DefaultTableModel(header, 0);
  411.         table = new JTable(tableModel);
  412.         table.setRowSelectionAllowed(false);
  413.         this.collection = collection;
  414.         setViewportView(table);
  415.         setPreferredSize(new Dimension(150, 200));
  416.         setBorder(BorderFactory.createTitledBorder("Kółka:"));
  417.     }
  418.  
  419.     /* Metodę refresh() należy wywołać po każdej
  420.      * modyfikacji zawartości wyświetlanej kolejcji
  421.      */
  422.     void refresh(){
  423.         tableModel.setRowCount(0);
  424.         for (Circle c : collection) {
  425.             String[] s = { c.getName(), ""+c.getX(), ""+c.getY() };
  426.             tableModel.addRow(s);
  427.         }
  428.     }
  429. } // koniec klasy ViewCollection
  430.  
  431.  
  432.  
  433.  
  434. /*=======  TU PROSZE SIE PODPISAC ==============================
  435.  *      Imię:
  436.  *  Nazwisko:
  437.  *Nr indeksu:
  438.  *==============================================================
  439.  */
  440.  
  441. /*
  442.  * Proszę uzupełnić klasy MyWindow, MyPanel oraz Circle i Printer tak,
  443.  * by powstała aplikacja graficzna działająca tak samo jak program
  444.  * Demonstacja.jar. Program jest prostą aplikacją graficzną tworzącą
  445.  * kolekcję będącą zbiorem obiektów klasy Circle.
  446.  *
  447.  * Zadanie 0:
  448.  * Uzupełnij klasę MyWindow tak, by zostało wyświetlone główne okno aplikacji
  449.  * o wymiarach 500 x 500 pikseli. Na pasku tytułowym tego okna powinno być
  450.  * wyświetlone Imię i Nazwisko autora programu. Zamknięcie tego okna powinno
  451.  * poprawnie zakończyć działanie całej aplikacji.
  452.  * Wnętrze okna proszę wypełnić panelem utworzonym jako obiekt klasy MyPanel,
  453.  * na którym będą rozmieszczane pozostałe elementy GUI.
  454.  *
  455.  * Zadanie 1:
  456.  * W oknie aplikacji proszę utworzyć menu główne, które zawiera
  457.  * następujące opcje:
  458.  *      "Autor" - w modalnym oknie dialogowym wyświetla
  459.  *                Twoje imię i nazwisko oraz numer indeksu,
  460.  *      "Opis programu" - w modalnym oknie dialogowym wyświetla
  461.  *                OPIS_PROGRAMU (stała tekstowa zdefiniowana w klasie MyWindow),
  462.  *      "Zakończ" - kończy działanie całej aplikacji.
  463.  *
  464.  * Zadanie 2:
  465.  * Uzupełnij klasę Circle o dodatkowe metody niezbędne do tego,
  466.  * by obiekty klasy Circle mogły być przechowywane w kolekcji
  467.  * klasy TreeSet.
  468.  * UWAGA: Proczę przyjąć założenie, że atrybut name w klasie Circle
  469.  * jednoznacznie identyfikuje koło.
  470.  *
  471.  * W klasie MyPanel utwórz kolekcję klasy TreeSet, do przechowywania
  472.  * obiektów klasy Circle.
  473.  *
  474.  * Zadanie 3:
  475.  * Na panelu wypełniającym główne okno aplikacji dodaj dwa przyciski
  476.  * "Dodaj losowe koło", "Usuń koła"  oraz obiekt klasy WidokKolekcji,
  477.  * w którym będzie mogła być wyświetlana zawartość kolekcji utworzonej
  478.  * w poprzednim zadaniu.
  479.  *
  480.  * Zadanie 4:
  481.  * Uzupełnij klasę MyPanel tak by:
  482.  *    - przycisk "Dodaj losowe koło" powodował wczytanie za pomocą
  483.  *      okna dialogowego nazwy nowego koła, wylosowanie współrzędnych
  484.  *      środka koła, a następnie by utworzył nowy obiekt klasy Circle,
  485.  *      i dodał ten obiekt do kolekcji utworzonej w zadaniu 2;
  486.  *    - przycisk "Usun koła" usuwał wszystkie obiekty z kolekcji.
  487.  *  
  488.  *    UWAGA: Wprowadzona nazwa koła musi być niepustym łańcuchem znaków.
  489.  * Po każdej modyfikacji zawartości kolekcji należy odświeżyć
  490.  * obiekt klasy WidokKolekcji poprzez wywołanie metody refresh();
  491.  * UWAGA: W KLASIE WidokKolekcji NIE TRZEBA NIC MODYFIKOWAĆ !!!
  492.  *
  493.  * Zadanie 5:
  494.  * Rozbuduj klasę MyPanel tak by na panelu wypełniającym okno aplikacji
  495.  * były wyświetlane wszystkie koła pamiętane w kolekcji.
  496.  * UWAGA: Po każdej modyfikacji zawartości kolekcji należy odświeżyć
  497.  * wyświetlany rysunek.
  498.  *
  499.  * Zadanie 6:
  500.  * Rozbuduj klasę MyPanel tak, by by było możliwe wykonywanie
  501.  * następujących operacji za pomocą myszki:
  502.  *   - kliknięcie na panelu powoduje wczytanie za pomocą
  503.  *      okna dialogowego nazwy nowego koła,  a następnie utworzenie
  504.  *      nowego koła (obiekt klasy Circle) o podanej nazwie i środku
  505.  *      w miejscu położenia kursora myszki;
  506.  *   - przeciąganie (ruch myszką przy wciśniętym przycisku) powoduje
  507.  *      przesuwanie wszystkich kół zapamiętanych w kolekcji.
  508.  *   UWAGA: Po każdej modyfikacji należy odświżyć wyświetlany rysunek
  509.  *   oraz dane wyświetlane w obiekcie klasy WidokKolekcji.
  510.  *      
  511.  * Zadanie 7:
  512.  *  Rozbuduj klasę MyPanel tak by było możliwe wykonywanie
  513.  *  następujących operacji za pomocą klawiatury:
  514.  *    - wpisanie znaku 'C' lub 'c' powoduje wczytanie za pomocą
  515.  *      okna dialogowego nazwy nowego koła, wylosowanie współrzędnych
  516.  *      środka koła, a następnie utworzenie nowego obiektu klasy Circle,
  517.  *      który zostanie dodany do kolekcji utworzonej w zadaniu 2;
  518.  *    - klawisz DELETE powoduje usunięcie wszystkich obiektów z kolekcji;
  519.  *    - klawisze strzałek powodują powolne przesuwanie (o 1 piksel)
  520.  *      wszystkich kół zgodnie z kierunkiem strzałki
  521.  *    - klawisze strzałek wraz z klawiszem SHIFT powodują szybkie przesuwanie
  522.  *      (o 10 pikseli) wszystkich kół zgodnie z kierunkiem strzałki.
  523.  *  UWAGA: Po każdej modyfikacji należy odświżyć wyświetlany rysunek
  524.  *   oraz dane wyświetlane w obiekcie klasy WidokKolekcji.
  525.  *
  526.  * Zadanie 8:
  527.  * W metodzie main klasy MyWindow proszę utworzyć jeden obiekt klasy Printer,
  528.  * który będzie zasobem współdzielonym przez dwa wątki producentów.
  529.  * Klasa Printer zawiera metodę print, która drukuje w oknie konsoli
  530.  * numer zlecenia oraz przkazany tekst.
  531.  * Ponadto proszę utworzyć dwa obiekty klasy Producer.
  532.  * Do konstruktorów tych obiektów należy przekazać referencję na wcześniej
  533.  * utworzony współdzielony obiekt klasy Printer, przykładowe teksty drukowane
  534.  * przez producentów oraz unikalne identyfikatory.
  535.  * (Jako przykładowe teksty do drukowania proszę przekazać swoje imię
  536.  * oraz swoje nazwisko). Proszę uruchomić tak utworzone obiekty wątków producenta.
  537.  *
  538.  * Następnie proszę zmodyfikować metodę print w klasie Printer, tak by ta metoda
  539.  * zapewniła poprawną koordynację realizowanych przez współbieżnie działające wątki
  540.  * zadań drukowania. Za pomocą metod wait i notify proszę zapewnić sprawiedliwy
  541.  * dostęp do drukarki  tzn. zapewnić, by ŻADEN PRODUCENT NIE MÓGŁ WYDRUKOWAĆ
  542.  * DWÓCH ZADAŃ NASTĘPUJĄCYCH BEZPOŚREDNIO PO SOBIE.
  543.  */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement