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

 }

}


 

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

7829. Философия истории. Культура и цивилизация 76.5 KB
  Философия истории. Культура и цивилизация. Термин Философия истории впервые употребил Вольтер (1694-1778), имея в виду универсальное историческое обозрение человеческой культуры. Философскому рассмотрению подлежат многие явления: Философия права, ...
7830. Философия личности. Значение слова личность 46 KB
  Философия личности Значение слова личность Понятие личности относится к числу сложнейших в учении о человеке (т.е. в философской антропологии). В европейских языках слово личность восходит к латинскому понятию персона, что означало маску актера ...
7831. Антропология или философия человека 59.5 KB
  Антропология или философия человека Антропология - учение о человеке. Философская антропология - философское учение о человеке или философия человека. Задача философской антропологии сводится к изучению и обоснованию сущности человеческого...
7832. Философия психоанализа. Фрейдизм и Неофрейдизм 49.5 KB
  Философия психоанализа Зигмунд Фрейд (1856-1939) - австрийский доктор. Толкование сновидений (1900). Работы Фрейда изменили облик психологии в 20 столетии. В советское время работы Фрейда не издавались. Они считались несерьезными и несовмести...
7833. Экзистенциализм (экзистенциональная философия) 51.5 KB
  Экзистенциализм (экзистенциональная философия) Серен Кьеркегор (1813-1855) Страх и трепет, чувство страха Карл Ясперс (1883-1969) Истоки истории и ее цель, Мартин Хайдеггер (1889-1976) Бытие и время, индивидуальное простраство-время, Ж-П. Сарт...
7834. Эллинско-римский период в развитии философии 75 KB
  Эллинско-римский период в развитии философии. Появляются три течения философской мысли. Эпикуреизм, стоицизм и скептицизм. Эпикуреизм и стоицизм - ренессанс. Скептицизм - декаданс. Эллинистическая философия. Период эллинизма с 338 года до н...
7835. Основные теории личности в психологии 16.24 KB
  Основные теории личности в психологии. Психодинамическая теория (классический психоанализ) Фрейда. Главный источник развития личности - врождённые факторы (инстинкты) или либидо (биологическая энергия). идет первые 6 лет. 3 фазы развития личности...
7836. Интеллектуальное развитие школьников во внеклассной работе 26 KB
  Интеллектуальное развитие школьников во внеклассной работе Формирование мировоззрения. Под мировоззрением следует понимать специфическую форму сознания человека, включающую систему взглядов, знаний, убеждений, идеалов, в которых выражается его отнош...
7837. Педагогічна діяльність і особистість педагога 58.5 KB
  Тема 1. Педагогічна діяльність і особистість педагога. Мета: ознайомити іззавданнями національної школи, виникненням і становленням педагогічної професії, з особливостями педагогічної професії: її своєрідністю, гуманістичною функцією, колектив...