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());

 }

}


 

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

40675. Современные системы и формы оплаты труда в Российской Федерации 29.5 KB
  Современные системы и формы оплаты труда в Российской Федерации. Сдельная построена в прямой зависимости от результатов труда. Сдельную оплату труда можно применять только на механических работах которые поддаются техническому нормированию. Разновидностью сдельной оплаты труда может быть сдельнопрогрессивная сдельнопремиальная косвенная сдельная и аккордная форма оплаты труда.
40676. Эффективность использования основных фондов (основного капитала) на предприятии. Амортизация 24 KB
  Эффективность использования основных фондов основного капитала на предприятии. Амортизация основных фондов есть форма возмещения износа основных фондов путем постепенного переноса ими своей стоимости на произведенный продукт то есть амортизация это денежное выражение физического и морального износа основных фондов. Накапливаемые амортизационные отчисления составляют амортизационный фонд за счет которого производится полное или частичное возмещение стоимости основных фондов. Амортизационный фонд делится на : 1 Часть идущая на...
40677. Оборотный капитал предприятия и эффективность его использования 34.5 KB
  Наличие у предприятия собственного оборотного капитала его состав и структура скорость оборота и эффективность использования оборотного капитала во многом предопределяют финансовое состояние предприятия и устойчивость его положения на рынке. Эффективное использование оборотного капитала играет большую роль в обеспечении нормальной работы предприятия повышении рентабельности хозяйственной деятельности и зависит от множества факторов. Обобщающим показателем эффективности использования оборотного капитала является его рентабельность Рок...
40678. Прибыль предприятия, ее формирование и использование 53.5 KB
  Прибыль предприятия ее формирование и использование. Прибыль в рыночном хозяйстве является вознаграждением такого специфического фактора как предпринимательство. Вовторых мы не можем трактовать прибыль как своеобразную равновесную цену по аналогии с рынком труда капитала и земли. Предприниматель в результате выполнения этих функций вправе претендовать на определенный доход прибыль.
40679. Организационно-правовые формы предприятия и их развитие в современных условиях 44.5 KB
  Организационноправовые формы предприятия и их развитие в современных условиях Фирма хозяйствующий субъект обладающий экономической самостоятельностью для осуществления производственной деятельности с целью получения прибыли. В настоящее время наибольшее распространение получили следующие формы предприятий организаций: индивидуальные предприятия; товарищества; акционерные общества; объединения предприятий ФПГ; государственные предприятия; смешанные предприятия. Преимущества: быстрая организация предприятия открытие и закрытие;...
40680. Эффективность производственно-хозяйственной деятельности предприятия. Показатели экономической эффективности 38.5 KB
  Эффективность производства – важнейшая качественная характеристика хозяйствования на всех уровнях. Под экономической эффективностью производства понимается степень использования производственного потенциала которая выявляется соотношением результатов и затрат общественного производства. Чем выше результат при тех же затратах чем быстрее он растет в расчете на единицу затрат общественно необходимого труда или чем меньше затрат на единицу полезного эффекта тем выше эффективность производства. Эффективность производства – это показатель...
40681. Производительность труда и ее показатели 27.5 KB
  Под ПРОИЗВОДИТЕЛЬНОСТЬЮ ТРУДА понимается рациональная созидательная производительность людей эффективность которой определяется отношением затраченного рабочего времени и количества произведенной продукции. Производительность труда измеряется количеством продукции вырабатываемой работником в сфере материального производства за единицу рабочего времени или количеством времени которое затрачивается на производство единицы продукции. Повышение производительности труда ведет к увеличению количества продукции производимой в единицу времени...
40682. Себестоимость: структура и пути снижения 29 KB
  Под себестоимостью продукции понимают выраженные в денежной форме текущие затраты предприятия на производство и реализацию продукции. Себестоимость продукции является одним из важнейших качественных показателей эффективности производства который позволяет осуществлять контроль над затратами живого и овеществленного труда и оценивать результаты производственной и хозяйственной деятельности предприятия. Снижение себестоимости продукции способствует увеличению внутрипроизводственных накоплений ускорению расширенного воспроизводства росту...
40683. Трудовые ресурсы и трудовой потенциал страны, региона 36.5 KB
  Подавляющую часть трудовых ресурсов составляет население в трудоспособном возрасте. Основное пополнение трудовых ресурсов происходит и будет происходить в будущем за счет населения моложе трудоспособного возраста. Трудовой потенциал есть совокупность всех трудовых возможностей как отдельного человека так и различных групп работников общества в целом. В отличие от трудовых ресурсов определяющих количество и структуру труда трудовой потенциал характеризует его качество и потенциальные возможности.