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

 }

}


 

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

47279. Структура тормозного управления автомобиля и требования, предъявляемые к нему 446.74 KB
  Каждая из этих систем включает в себя тормозные механизмы обеспечивающие создание сопротивления движению автомобиля и тормозной привод необходимый для управления тормозными механизмами. К тормозной системе автомобиля предъявляются высокие требования. Стояночная тормозная система выполняет также функцию аварийной тормозной системы в случае выхода из строя рабочей тормозной системы. Каждая тормозная система состоит из тормозных механизмов которые обеспечивают затормаживание колес или вал трансмиссий и тормозного привода приводящего в...
47280. Разработка сети электроснабжения нового района города и коттеджного поселка 5.19 MB
  Построение вариантов схемы сети 380 В города и коттеджного поселка. Техникоэкономическое сравнение и выбор оптимального варианта схемы городской сети 380 В. Построение конкурентно способных вариантов схемы сети 10 кВ с учетом коттеджного поселка и выбор электрооборудования.
47282. Классификация и общая характеристика учреждений, предоставляющих социальные услуги 235 KB
  Предоставление социальных услуг без обеспечения проживания это предоставление услуг социального характера консультаций материальной помощи помощи беженцам и аналогичных услуг отдельным лицам и семьям на дому или в других местах. К учреждениям оказывающим социальные услуги без обеспечения проживания относятся комплексные центры социального обслуживания центры социального обслуживания семьи и детей центры социального обслуживания лиц без определенного места жительства и т. В центрах социального обслуживания населения и в отделах...
47283. Управление дебиторской задолженностью открытого акционерного общества «Коммунальные системы БАМа» 680.5 KB
  Сущность дебиторской задолженности Факторы влияющие на уровень дебиторской задолженности. Пути снижения дебиторской задолженности. Управление дебиторской задолженностью на примере ОАО Коммунальные Системы БАМа. Анализ дебиторской задолженности предприятия в целом.
47284. Цех подготовки фабрики газетной бумаги в г. Шклове 2.47 MB
  Определение крановых нагрузок В данном дипломном проекте выполнен расчет одной подкрановой балки расположенной по оси 1 расчётной рамы разрез 11 в пролете 14 которая идентична подкрановой балке по оси 4. Вариант 1 2 крана Используя правило Винклера устанавливаем два груза на балке и находим положение равнодействующей R относительно опоры А: мм Расстояние от критического груза до равнодействующей: С = 24 3 = 06 м По теореме Винклера устанавливаем колёса крана на балке таким образом чтобы расстояние от левой опоры до...