35420

Программирование интернет приложений

Лабораторная работа

Информатика, кибернетика и программирование

При щелчке мышкой по графику должна отображаться точка, цвет которой зависит от попадания или непопадания в область, при этом компоненты графического интерфейса должны отображать значения координат точки. При задании значений координат точки и R на графике должна также отображаться точка соответствующего цвета.

Русский

2013-09-10

29.89 KB

16 чел.

Программирование интернет приложений, №4

Чередниченко Сергей, 3120, вариант 761

Задание:

Доработать программу из лабораторной работы №3 следующим образом. Реализовать приложение на базе Swing API, которое отображает на экране заданную область и заданные компоненты пользовательского интерфейса, с помощью которых вводятся данные о координатах точек и параметре R.

При щелчке мышкой по графику должна отображаться точка, цвет которой зависит от попадания или непопадания в область, при этом компоненты графического интерфейса должны отображать значения координат точки. При задании значений координат точки и R на графике должна также отображаться точка соответствующего цвета.

Согласно полученному варианту необходимо реализовать анимацию с использованием Java-потоков.

Приложение должно использовать следующие элементы:

  1.  Для задания координаты X использовать JComboBox.
  2.  Для задания координаты У - JRadioButton.
  3.  Для задания R - JSlider.
  4.  Для отображения координат установленной точки - JLabel.
  5.  Элементы необходимо группировать с использованием менеджера компоновки BorderLayout.
  6.  В рамках групп необходимо использовать BoxLayout .
  7.  При изменении радиуса должна осуществляется перерисовка точек с пересчетом масштаба.
  8.  При отрисовке области в качестве цвета фона использовать белый цвет.
  9.  Для заливки области использовать черный цвет.

Приложение должно включать анимацию следующего вида: 
точки на области должны плавно появляться в течение 2 секунд после установки
Условие запуска анимац
ии: установка точки в область.

Многопоточность должна быть реализована с помощью расширения класса Thread.

Программа на Java:

Easygui.java

package easygui;

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

import javax.swing.event.ChangeEvent;

import javax.swing.event.ChangeListener;

public class Easygui {

   

   private static double x, y, r;

   private static Draw obj = new Draw(4.0);

   private static JPanel toolPanel;

   private static JLabel xandy;

   public static void main(String[] args) {

JFrame frame = new JFrame("Test");

frame.setVisible(true);

frame.setSize(700, 700);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.add(obj, BorderLayout.CENTER);

obj.addMouseListener(new MouseAL());

toolPanel = new JPanel();

frame.add(toolPanel, BorderLayout.SOUTH);

toolPanel.setLayout(new BoxLayout(toolPanel, BoxLayout.Y_AXIS));

 

// X

try {

String[] cbargs = {"-4", "-3", "-2", "-1", "0", "1", "2", "3", "4"};

JComboBox cb = new JComboBox(cbargs);

cb.addActionListener(new CBActionListener());

toolPanel.add(cb);

} catch (Exception e) { System.out.println("Something went wrong"); }

 

// Y

JRadioButton rbm4 = new JRadioButton("-4");

JRadioButton rbm1 = new JRadioButton("-1");

JRadioButton rb0 = new JRadioButton("0");

JRadioButton rb1 = new JRadioButton("1");

JRadioButton rb3 = new JRadioButton("3");

rb0.setSelected(true);

toolPanel.add(rbm4);

toolPanel.add(rbm1);

toolPanel.add(rb0);

toolPanel.add(rb1);

toolPanel.add(rb3);

ButtonGroup group = new ButtonGroup();

group.add(rbm4);

group.add(rbm1);

group.add(rb0);

group.add(rb1);

group.add(rb3);

rbm4.addActionListener(new RBActionListener());

rbm1.addActionListener(new RBActionListener());

rb0.addActionListener(new RBActionListener());

rb1.addActionListener(new RBActionListener());

rb3.addActionListener(new RBActionListener());

 

// R

JSlider js = new JSlider(0, 4);

js.setValue(4);

js.addChangeListener(new JSSliderListener());

toolPanel.add(js);

 

// Coordinates

xandy = new JLabel("");

toolPanel.add(xandy);

xandy.setText("x = " + x + ", y = " + y);

   }

   

   static class MouseAL extends MouseAdapter {

public void mouseReleased(MouseEvent e) {

    if (obj.IsAnimated()) return;

    x = obj.pixelsToX(e.getX()) ;

    y = obj.pixelsToY(e.getY());

    obj.drawing(x, y);

    xandy.setText("x = " + String.format("%.2f", x) + ", y = " +

     String.format("%.2f", x));

}

   }

   

   static class CBActionListener implements ActionListener {

@Override

public void actionPerformed(ActionEvent e) {

    if (obj.IsAnimated()) return;

    JComboBox cb = (JComboBox)e.getSource();

    x = Integer.parseInt((String)cb.getSelectedItem());

    obj.drawing(x, y);

    xandy.setText("x = " + String.format("%.2f", x) + ", y = " +

     String.format("%.2f", y));

}

 

   }

   

   static class RBActionListener implements ActionListener {

@Override

public void actionPerformed(ActionEvent e) {

    if (obj.IsAnimated()) return;

    System.out.println("radio button");

    JRadioButton b = (JRadioButton)e.getSource();

    if (b.isSelected()) {

 y = Integer.parseInt(b.getText());

 obj.drawing(x, y);

 xandy.setText("x = " + String.format("%.2f", x) + ", y = " +

     String.format("%.2f", y));

    }

}

 

   }

   

   static class JSSliderListener implements ChangeListener {

public void stateChanged(ChangeEvent e) {

    JSlider source = (JSlider)e.getSource();

    if (!source.getValueIsAdjusting()) {

 r = (int)source.getValue();

 obj.setR(r);

    }    

}

   }

}

Draw.java

package easygui;

import javax.swing.*;

import java.awt.*;

import java.util.ArrayList;

public class Draw extends JPanel implements Runnable {

   // the emerging point parameters

   private int x, y, trsp;

   private boolean inside;

   

   private ArrayList<Pair<Double, Double> > points;

   private double radius;

   private double graphWidth, graphHeight;

   Thread t = null;

   

   public Draw(double R) {

points = new ArrayList<Pair<Double, Double>>();

graphWidth = 10.0;

graphHeight = 10.0;

if (R > graphHeight || R > graphWidth)

    radius = graphHeight > graphWidth ? graphWidth : graphHeight;

else

    radius = R;

   }

   

   // px and py are pixels

   private void addPoint(int px, int py) {

points.add(new Pair<Double, Double>(pixelsToX(px), pixelsToY(py)));

   }

   

   // x and y are coordinates

   private void addPoint(double x, double y) {

points.add(new Pair<Double, Double>(x, y));

   }

   

   private boolean isInsideArea(Pair<Double,Double> p) {

double x = p.getLeft().doubleValue();

double y = p.getRight().doubleValue();

 

if (x < 0) {

    if (y > 0) {

 return x > y - radius/2;

    }

    else if (y == 0) {

 return x > -radius/2;

    }

    else if (y < 0) {

 return x > -radius/2 && y > -radius;

    }

}

else if (x == 0) {

    return y < 0 && y > -radius;

}

else if (x > 0) {

    if (y < 0) {

 double r = Math.sqrt(x*x + y*y);

 return r < radius;

    }

    else

 return false;

}

return true;

   }

   

   // creates an animation for a newly added point

   public void drawing(double xx, double yy) {

x = xToPixels(xx);

y = yToPixels(yy);

trsp = 0;

inside = isInsideArea(

 new Pair<Double, Double>(xx, yy));

t = new Thread(this);

t.start();

   }

   

   public void setR(double r) {

if (r > graphHeight || r > graphWidth)

    radius = graphHeight > graphWidth ? graphWidth : graphHeight;

else

    radius = r;

repaint();

   }

   

   public boolean IsAnimated() {

return t != null;

   }

   

   // runs the animation

   @Override

   public void run() {

while (true) {

    if (t == null)

 return;

    trsp++;

    try {

 Thread.sleep(10);

    } catch (Exception e) {}

    repaint();

}

   }

   

// ***** conversions between graph and pixel coordinates *****

   public int xToPixels(double x) {

int m = getWidth()/2;

return (int)(m * (1 + x*2/graphWidth));

   }

   

   public int yToPixels(double y) {

int m = getHeight()/2;

return (int)(m * (1 - y*2/graphHeight));

   }

   

   public double pixelsToX(int p) {

double m = getWidth()/2;

return (p-m)/m*graphWidth/2;

   }

   

   public double pixelsToY(int p) {

double m  = getHeight()/2;

return (m-p)/m*graphHeight/2;

   }

// ***** conversions between graph and pixel coordinates *****

   

   private void drawEmergingPoint(Graphics g) {

if (t == null) return; // protection from x,y trash values

if (trsp > 255) {

    trsp = 255;

    t = null;

    // add the point to the graph

    addPoint(x, y);

}

Color c;

if (inside)

    c = new Color(Color.GREEN.getRed(),

 Color.GREEN.getGreen(), Color.GREEN.getBlue(), trsp);

else

    c = new Color(Color.RED.getRed(),

 Color.RED.getGreen(), Color.RED.getBlue(), trsp);     

g.setColor(c);

g.fillOval(x-5, y-5, 10, 10);

 

   }

   

   private void drawGraphBody(Graphics g) {

g.setColor(Color.BLACK);

// little left-top triangle

int[] xPoints = { xToPixels(0), xToPixels(-radius/2), xToPixels(0) };

int[] yPoints = { yToPixels(0), yToPixels(0), yToPixels(radius/2) };

g.fillPolygon(xPoints, yPoints, 3);

 

// left-bottom rectangle

int wr = xToPixels(0) - xToPixels(-radius/2);

int hr = yToPixels(-radius) - yToPixels(0);

g.fillRect(xToPixels(-radius/2), yToPixels(0), wr, hr);

 

// arc

g.fillArc(xToPixels(-radius), yToPixels(radius), wr*4, hr*2, 0, -90);

 

// coordinate lines

g.setColor(Color.BLUE);

g.drawLine(xToPixels(-radius), yToPixels(0),

 xToPixels(radius), yToPixels(0));

g.drawLine(xToPixels(0), yToPixels(radius),

 xToPixels(0), yToPixels(-radius));

   }

   

   private void drawAddedPoints(Graphics g) {

for (Pair<Double, Double> p: points)

    if (isInsideArea(p)) {

 g.setColor(Color.GREEN);

 g.fillOval(xToPixels(p.getLeft().doubleValue())-5,

  yToPixels(p.getRight().doubleValue())-5, 10, 10);

    }

    else {

 g.setColor(Color.RED);

 g.fillOval(xToPixels(p.getLeft().doubleValue())-5,

  yToPixels(p.getRight().doubleValue())-5, 10, 10);

    }

   }

   

   @Override

   public void paintComponent(Graphics g) {

super.paintComponent(g);

 

setBackground(Color.WHITE);

drawGraphBody(g);

drawAddedPoints(g);

drawEmergingPoint(g);

   }

}

Pair.java

package easygui;

public class Pair<L,R> {

 private final L left;

 private final R right;

 public Pair(L left, R right) {

   this.left = left;

   this.right = right;

 }

 public L getLeft() { return left; }

 public R getRight() { return right; }

 @Override

 public int hashCode() { return left.hashCode() ^ right.hashCode(); }

 @Override

 public boolean equals(Object o) {

   if (o == null) return false;

   if (!(o instanceof Pair)) return false;

   Pair pairo = (Pair) o;

   return this.left.equals(pairo.getLeft()) &&

          this.right.equals(pairo.getRight());

 }

}


 

А также другие работы, которые могут Вас заинтересовать

29833. Нелинейные СУ 266.5 KB
  Типовые нелинейные звенья и их характеристики. Типовые соединения нелинейных звеньев и их характеристики. Линеаризация статических характеристик методы компенсационных и вибрационных линеаризации...
29834. Постановка задач синтеза систем управления 96.5 KB
  Задачи синтеза систем управления. Методы синтеза систем управления. Инженерные методы структурно параметрического синтеза.
29835. Динамика нелинейных систем 222 KB
  Метод фазовой плоскости. Метод фазовой плоскости. Пространство координат которое является фазовой характеристикой и ее производные называется пространством состояний системы. След перемещения изображающей точки в фазовом пространстве соответствует изменению состояния системы и называется фазовой траекторией.
29836. Построение фазовой траектории методом изоклин 268.5 KB
  Построение фазовой траектории методом изоклин. Метод изоклин даёт направления касательных к фазовой траектории на фазовой плоскости.1 на семействе изоклин отметим точку А соответствующую начальным условиям из этой точки нужно провести два луча направления которых соответствуют углам наклона касательных данной изоклины и соседней разделить угол между лучами пополам и провести биссектрису до следующей изоклины пересечение биссектрисы со следующей изоклиной даёт следующую точку фазовой траектории далее процесс повторяется если...
29837. Методика построения фазового портрета автономной нелинейной системы управления 320.5 KB
  Методика построения фазового портрета автономной нелинейной системы управления. Анализ нелинейной системы управления в частотной области. Методика построения фазового портрета автономной нелинейной системы управления. Для нелинейной системы управления с кусочнолинейной статической характеристикой при построении фазового портрета используется следующий подход: На статической характеристике определяются зоны линейности.
29838. Преобразование линейной системой спектральных плотностей стационарного случайного процесса 322 KB
  Задачи исследования линейной системы управления при стационарных случайных воздействиях. 7 Если на входе системы случайный процесс то на выходе тоже случайный процесс и между входом и выходом существует зависимость. Определим взаимную спектральную плотность случайного процесса на входе и выходе линейной системы управления : Определим спектральную плотность между x и y: Взаимодействие двух процессов определяется и...
29840. АНАЛИЗ ЛИНЕЙНЫХ СИСТЕМ УПРАВЛЕНИЯ 122.5 KB
  АНАЛИЗ ЛИНЕЙНЫХ СИСТЕМ УПРАВЛЕНИЯ. Предмет и задачи курса теории управления. Принципы управления. Классификация систем управления.
29841. Дискретные системы управления. Математическое описание дискретных сигналов 325.5 KB
  Свойства спектра дискретного сигнала и погрешности восстановления непрерывного сигнала. Аналитическое представление такого сигнала Аналитическое представление АИМ сигнала формула При представлении дискретного сигнала в виде числовой последовательности отсутствует время t поэтому к числовым последовательностям не применимы интегральные преобразования.