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

 }

}


 

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

9990. Символьные вычисления в MathCAD 211 KB
  Символьные вычисления в MathCAD Кроме вычисления выражения численно программа использует символьную математику результатом вычисления выражения является другое выражение. Первоначальное выражение можно разложить на множители проинтегрировать его решить уравнение...
9991. Решение уравнений, построение графиков и анимация в MathCad на примере исследования термодинамической системы. Задача о чашке кофе 42 KB
  Решение уравнений построение графиков и анимация в MathCad на примере исследования термодинамической системы. Задача о чашке кофе Рассматривается пример исследования термодинамической системы в Mathcad. Постановка задачи и порядок выполнения работы описывается в соо