Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.awt.*;
- import java.awt.event.*;
- import java.util.*;
- import javax.swing.*;
- import javax.swing.table.DefaultTableModel;
- /*======= TU PROSZE SIE PODPISAC ==============================
- * Imie:
- * Nazwisko:
- *Nr indeksu:
- * Grupa: 18 Grudnia 2018, wtNP 11:15 np. Pn/P 9:15
- *==============================================================
- */
- class Circle implements Comparable<Circle> {
- private int x, y;
- private String name;
- public Circle(String name, int x, int y){
- this.name = name;
- this.x = x;
- this.y = y;
- }
- public int getX() {
- return x;
- }
- public int getY() {
- return y;
- }
- public String getName() {
- return name;
- }
- public void move(int dx, int dy){
- x+=dx;
- y+=dy;
- }
- public void draw(Graphics g){
- g.drawOval(x-25, y-25, 50, 50);
- g.drawString(name, x-15, y);
- }
- @Override
- public int compareTo(Circle circle) {
- return this.name.compareTo(circle.getName());
- }
- // Tu proszę dopisać brakujące metody, które są niezbędne,
- // by obiekty klasy Circle mogły być przechowywane w kolekcji.
- } // koniec klasy Circle
- import java.awt.*;
- import java.awt.event.*;
- import java.util.*;
- import javax.swing.*;
- import javax.swing.table.DefaultTableModel;
- /*======= TU PROSZE SIE PODPISAC ==============================
- * Imie:
- * Nazwisko:
- *Nr indeksu:
- * Grupa: 18 Grudnia 2018, wtNP 11:15 np. Pn/P 9:15
- *==============================================================
- */
- class MyPanel extends JPanel implements MouseListener, MouseMotionListener, KeyListener{
- private static final long serialVersionUID = 1L;
- protected TreeSet<Circle> circleSet;
- protected JButton buttonAddRandom;
- protected JButton buttonRemoveAll;
- protected ViewCollection viewCollection;
- private int mouseX = 0;
- private int mouseY = 0;
- public MyPanel() {
- this.addMouseListener(this);
- this.addMouseMotionListener(this);
- this.addKeyListener(this);
- this.setFocusable(true);
- this.requestFocus();
- circleSet = new TreeSet<Circle>();
- buttonAddRandom = new JButton("Dodaj losowe koło");
- buttonRemoveAll = new JButton("Usuń koła");
- buttonAddRandom.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e){
- String name = JOptionPane.showInputDialog("Podaj nazwę koła");
- if(name == null || name.isEmpty()) return;
- Circle circleNew = new Circle(name, (int)(Math.random()*500), (int)(Math.random()*500));
- circleSet.add(circleNew);
- refresh();
- }});
- buttonRemoveAll.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e){
- circleSet.clear();
- refresh();
- }});
- viewCollection = new ViewCollection(circleSet);
- this.add(buttonAddRandom);
- this.add(buttonRemoveAll);
- this.add(viewCollection);
- }
- @Override
- public void paintComponent(Graphics g){
- super.paintComponent(g);
- for(Circle circle : circleSet) {
- circle.draw(g);
- }}
- protected void refresh()
- {
- viewCollection.refresh();
- repaint();
- }
- @Override
- public void keyPressed(KeyEvent event) {
- if(event.getKeyCode() == KeyEvent.VK_DELETE) {
- circleSet.clear();
- refresh();
- }
- }
- @Override
- public void keyReleased(KeyEvent event) {
- }
- @Override
- public void keyTyped(KeyEvent event) {
- if(event.getKeyChar() == 'c' || event.getKeyChar() == 'C') {
- String name = JOptionPane.showInputDialog("Podaj nazwę koła");
- if(name == null || name.isEmpty()) return;
- Circle circleNew = new Circle(name, (int)(Math.random()*500), (int)(Math.random()*500));
- circleSet.add(circleNew);
- refresh();
- }
- }
- @Override
- public void mouseDragged(MouseEvent event) {
- for(Circle circle : circleSet) {
- circle.move((int)(event.getX() - mouseX), (int)(event.getY() - mouseY));
- }
- mouseX = (int)this.getMousePosition().getX();
- mouseY = (int)this.getMousePosition().getY();
- refresh();
- }
- @Override
- public void mouseMoved(MouseEvent event) {
- mouseX = (int)this.getMousePosition().getX();
- mouseY = (int)this.getMousePosition().getY();
- }
- @Override
- public void mouseClicked(MouseEvent event) {
- String name = JOptionPane.showInputDialog("Podaj nazwę koła");
- if(name == null || name.isEmpty()) return;
- Circle circleNew = new Circle(name, event.getX(), event.getY());
- circleSet.add(circleNew);
- refresh();
- }
- @Override
- public void mouseEntered(MouseEvent arg0) {
- }
- @Override
- public void mouseExited(MouseEvent arg0) {
- }
- @Override
- public void mousePressed(MouseEvent event) {
- }
- @Override
- public void mouseReleased(MouseEvent arg0) {
- }
- } // koniec klasy MyPanel
- import java.awt.*;
- import java.awt.event.*;
- import java.util.*;
- import javax.swing.*;
- import javax.swing.table.DefaultTableModel;
- /*======= TU PROSZE SIE PODPISAC ==============================
- * Imie:
- * Nazwisko:
- *Nr indeksu:
- * Grupa: 18 Grudnia 2018, wtNP 11:15 np. Pn/P 9:15
- *==============================================================
- */
- public class MyWindow extends JFrame{
- private static final long serialVersionUID = 1L;
- protected JMenuBar menuBarMain;
- protected JMenu menuOptions;
- protected JMenuItem menuItemAuthor;
- protected JMenuItem menuItemDescription;
- protected JMenuItem menuItemExit;
- private static final String AUTHOR =
- " Imie:\r\n" +
- " Nazwisko:\r\n" +
- " Nr indeksu:\r\n" +
- " Grupa: 18 Grudnia 2018, wtNP 11:15 np. Pn/P 9:15\r\n";
- private static final String OPIS_PROGRAMU =
- "KLAWIATURA:\n" +
- " * strzałki ==> wolne przesuwanie kółek (o 1 piksel)\n" +
- " * Shift+strzałki ==> szybkie przesuwanie kółek (o 10 pikseli)\n" +
- " * Delete ==> kasowanie wszystkich kółek\n" +
- " * C, c -> dodawanie nowego kółko w losowym miejscu\n\n" +
- "MYSZKA:\n" +
- " * kilknięcie ==> dodanie nowego kółka w miejscu kursora myszki\n" +
- " * przeciąganie ==> przesuwanie wszystkich kółek";
- public static void main(String[] args) {
- new MyWindow();
- // Tu proszę dopisać instrukcje zgodnie z wytycznymi zadania 8
- }
- public MyWindow() {
- this.setSize(500, 500);
- this.setDefaultCloseOperation(EXIT_ON_CLOSE);
- this.setResizable(false);
- this.setTitle("Filip Wanat");
- MyPanel panelMain = new MyPanel();
- this.setContentPane(panelMain);
- menuBarMain = new JMenuBar();
- menuOptions = new JMenu();
- menuOptions.setText("Opcje");
- menuItemAuthor = new JMenuItem();
- menuItemDescription = new JMenuItem();
- menuItemExit = new JMenuItem();
- menuItemAuthor.setText("Autor");
- menuItemDescription.setText("Opis programu");
- menuItemExit.setText("Zakończ");
- menuItemAuthor.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- JOptionPane.showMessageDialog(null, AUTHOR);
- }});
- menuItemDescription.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- JOptionPane.showMessageDialog(null, OPIS_PROGRAMU);
- }});
- menuItemExit.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- System.exit(0);
- }});
- ;
- menuItemDescription.setText("Opis programu");
- menuItemExit.setText("Zakończ");
- menuOptions.add(menuItemAuthor);
- menuOptions.add(menuItemDescription);
- menuOptions.add(menuItemExit);
- menuBarMain.add(menuOptions);
- this.setJMenuBar(menuBarMain);
- this.setVisible(true);
- }
- } // koniec klasy MyWindow
- import java.awt.*;
- import java.awt.event.*;
- import java.util.*;
- import javax.swing.*;
- import javax.swing.table.DefaultTableModel;
- /*======= TU PROSZE SIE PODPISAC ==============================
- * Imie:
- * Nazwisko:
- *Nr indeksu:
- * Grupa: 18 Grudnia 2018, wtNP 11:15 np. Pn/P 9:15
- *==============================================================
- */
- //KLASA POMOCNICZA DO ZADANIA NR 8
- class Printer {
- volatile int id = 0; // id Producenta, który ostatnio korzystał z drukarki
- int nr = 0; // numer zadania (automatycznie incrementowany).
- // Proszę zmodyfikować metodę print zgodnie z wytycznymi do zadania 8.
- void print(String text, int id) {
- System.out.println(++nr + ": " + text);
- }
- } // Koniec klasy Printer
- import java.awt.*;
- import java.awt.event.*;
- import java.util.*;
- import javax.swing.*;
- import javax.swing.table.DefaultTableModel;
- /*======= TU PROSZE SIE PODPISAC ==============================
- * Imie:
- * Nazwisko:
- *Nr indeksu:
- * Grupa: 18 Grudnia 2018, wtNP 11:15 np. Pn/P 9:15
- *==============================================================
- */
- //KLASA POMOCNICZA DO ZADANIA NR 8
- //W TEJ KLASIE NIE TRZEBA NIC MODYFIKOWAĆ!!!
- class Producer extends Thread
- { Printer printer;
- String text;
- int id;
- public Producer(Printer printer, String text, int id) {
- this.printer = printer;
- this.text = text;
- this.id = id;
- }
- @Override
- public void run() {
- while (true){
- printer.print(text, id);
- try {
- sleep(500 + (long)(Math.random()*3000));
- } catch (InterruptedException e) { }
- }
- }
- } // koniec klasy Producer
- import java.awt.*;
- import java.awt.event.*;
- import java.util.*;
- import javax.swing.*;
- import javax.swing.table.DefaultTableModel;
- /*======= TU PROSZE SIE PODPISAC ==============================
- * Imie:
- * Nazwisko:
- *Nr indeksu:
- * Grupa: 18 Grudnia 2018, wtNP 11:15 np. Pn/P 9:15
- *==============================================================
- */
- class ViewCollection extends JScrollPane {
- private static final long serialVersionUID = 1L;
- // W TEJ KLASIE NIE TRZEBA NIC MODYFIKOWAĆ !!!
- private JTable table;
- private DefaultTableModel tableModel;
- Collection<Circle> collection;
- /* Do konstruktora należy przekazać referencję
- * na kolekcję, której zawartość ma być wyświetlana
- * na panelu
- */
- ViewCollection(Collection<Circle> collection) {
- String[] header = { "Nazwa", " x ", " y " };
- tableModel = new DefaultTableModel(header, 0);
- table = new JTable(tableModel);
- table.setRowSelectionAllowed(false);
- this.collection = collection;
- setViewportView(table);
- setPreferredSize(new Dimension(150, 200));
- setBorder(BorderFactory.createTitledBorder("Kółka:"));
- }
- /* Metodę refresh() należy wywołać po każdej
- * modyfikacji zawartości wyświetlanej kolejcji
- */
- void refresh(){
- tableModel.setRowCount(0);
- for (Circle c : collection) {
- String[] s = { c.getName(), ""+c.getX(), ""+c.getY() };
- tableModel.addRow(s);
- }
- }
- } // koniec klasy ViewCollection
- /*======= TU PROSZE SIE PODPISAC ==============================
- * Imię:
- * Nazwisko:
- *Nr indeksu:
- *==============================================================
- */
- /*
- * Proszę uzupełnić klasy MyWindow, MyPanel oraz Circle i Printer tak,
- * by powstała aplikacja graficzna działająca tak samo jak program
- * Demonstacja.jar. Program jest prostą aplikacją graficzną tworzącą
- * kolekcję będącą zbiorem obiektów klasy Circle.
- *
- * Zadanie 0:
- * Uzupełnij klasę MyWindow tak, by zostało wyświetlone główne okno aplikacji
- * o wymiarach 500 x 500 pikseli. Na pasku tytułowym tego okna powinno być
- * wyświetlone Imię i Nazwisko autora programu. Zamknięcie tego okna powinno
- * poprawnie zakończyć działanie całej aplikacji.
- * Wnętrze okna proszę wypełnić panelem utworzonym jako obiekt klasy MyPanel,
- * na którym będą rozmieszczane pozostałe elementy GUI.
- *
- * Zadanie 1:
- * W oknie aplikacji proszę utworzyć menu główne, które zawiera
- * następujące opcje:
- * "Autor" - w modalnym oknie dialogowym wyświetla
- * Twoje imię i nazwisko oraz numer indeksu,
- * "Opis programu" - w modalnym oknie dialogowym wyświetla
- * OPIS_PROGRAMU (stała tekstowa zdefiniowana w klasie MyWindow),
- * "Zakończ" - kończy działanie całej aplikacji.
- *
- * Zadanie 2:
- * Uzupełnij klasę Circle o dodatkowe metody niezbędne do tego,
- * by obiekty klasy Circle mogły być przechowywane w kolekcji
- * klasy TreeSet.
- * UWAGA: Proczę przyjąć założenie, że atrybut name w klasie Circle
- * jednoznacznie identyfikuje koło.
- *
- * W klasie MyPanel utwórz kolekcję klasy TreeSet, do przechowywania
- * obiektów klasy Circle.
- *
- * Zadanie 3:
- * Na panelu wypełniającym główne okno aplikacji dodaj dwa przyciski
- * "Dodaj losowe koło", "Usuń koła" oraz obiekt klasy WidokKolekcji,
- * w którym będzie mogła być wyświetlana zawartość kolekcji utworzonej
- * w poprzednim zadaniu.
- *
- * Zadanie 4:
- * Uzupełnij klasę MyPanel tak by:
- * - przycisk "Dodaj losowe koło" powodował wczytanie za pomocą
- * okna dialogowego nazwy nowego koła, wylosowanie współrzędnych
- * środka koła, a następnie by utworzył nowy obiekt klasy Circle,
- * i dodał ten obiekt do kolekcji utworzonej w zadaniu 2;
- * - przycisk "Usun koła" usuwał wszystkie obiekty z kolekcji.
- *
- * UWAGA: Wprowadzona nazwa koła musi być niepustym łańcuchem znaków.
- * Po każdej modyfikacji zawartości kolekcji należy odświeżyć
- * obiekt klasy WidokKolekcji poprzez wywołanie metody refresh();
- * UWAGA: W KLASIE WidokKolekcji NIE TRZEBA NIC MODYFIKOWAĆ !!!
- *
- * Zadanie 5:
- * Rozbuduj klasę MyPanel tak by na panelu wypełniającym okno aplikacji
- * były wyświetlane wszystkie koła pamiętane w kolekcji.
- * UWAGA: Po każdej modyfikacji zawartości kolekcji należy odświeżyć
- * wyświetlany rysunek.
- *
- * Zadanie 6:
- * Rozbuduj klasę MyPanel tak, by by było możliwe wykonywanie
- * następujących operacji za pomocą myszki:
- * - kliknięcie na panelu powoduje wczytanie za pomocą
- * okna dialogowego nazwy nowego koła, a następnie utworzenie
- * nowego koła (obiekt klasy Circle) o podanej nazwie i środku
- * w miejscu położenia kursora myszki;
- * - przeciąganie (ruch myszką przy wciśniętym przycisku) powoduje
- * przesuwanie wszystkich kół zapamiętanych w kolekcji.
- * UWAGA: Po każdej modyfikacji należy odświżyć wyświetlany rysunek
- * oraz dane wyświetlane w obiekcie klasy WidokKolekcji.
- *
- * Zadanie 7:
- * Rozbuduj klasę MyPanel tak by było możliwe wykonywanie
- * następujących operacji za pomocą klawiatury:
- * - wpisanie znaku 'C' lub 'c' powoduje wczytanie za pomocą
- * okna dialogowego nazwy nowego koła, wylosowanie współrzędnych
- * środka koła, a następnie utworzenie nowego obiektu klasy Circle,
- * który zostanie dodany do kolekcji utworzonej w zadaniu 2;
- * - klawisz DELETE powoduje usunięcie wszystkich obiektów z kolekcji;
- * - klawisze strzałek powodują powolne przesuwanie (o 1 piksel)
- * wszystkich kół zgodnie z kierunkiem strzałki
- * - klawisze strzałek wraz z klawiszem SHIFT powodują szybkie przesuwanie
- * (o 10 pikseli) wszystkich kół zgodnie z kierunkiem strzałki.
- * UWAGA: Po każdej modyfikacji należy odświżyć wyświetlany rysunek
- * oraz dane wyświetlane w obiekcie klasy WidokKolekcji.
- *
- * Zadanie 8:
- * W metodzie main klasy MyWindow proszę utworzyć jeden obiekt klasy Printer,
- * który będzie zasobem współdzielonym przez dwa wątki producentów.
- * Klasa Printer zawiera metodę print, która drukuje w oknie konsoli
- * numer zlecenia oraz przkazany tekst.
- * Ponadto proszę utworzyć dwa obiekty klasy Producer.
- * Do konstruktorów tych obiektów należy przekazać referencję na wcześniej
- * utworzony współdzielony obiekt klasy Printer, przykładowe teksty drukowane
- * przez producentów oraz unikalne identyfikatory.
- * (Jako przykładowe teksty do drukowania proszę przekazać swoje imię
- * oraz swoje nazwisko). Proszę uruchomić tak utworzone obiekty wątków producenta.
- *
- * Następnie proszę zmodyfikować metodę print w klasie Printer, tak by ta metoda
- * zapewniła poprawną koordynację realizowanych przez współbieżnie działające wątki
- * zadań drukowania. Za pomocą metod wait i notify proszę zapewnić sprawiedliwy
- * dostęp do drukarki tzn. zapewnić, by ŻADEN PRODUCENT NIE MÓGŁ WYDRUKOWAĆ
- * DWÓCH ZADAŃ NASTĘPUJĄCYCH BEZPOŚREDNIO PO SOBIE.
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement