[ create a new paste ] login | about

Link: http://codepad.org/Dpeu67WY    [ raw code | fork ]

Plain Text, pasted on Jan 17:
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Canvas;
import java.awt.Choice;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public final class Trigo extends Frame implements ItemListener, ActionListener {

  private MyCanvas _myCanvas;
  private TextField _inputField;
  private Label _currentLabel;
  private Button _button;
  private double _currentValue;

  private Trigo(String title) {
    super(title);
    addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent evt) {
          dispose();
        }
      });
    _myCanvas = new MyCanvas();
    _currentValue = 1.0;
  }

  public static void main(final String[] args) {
    Trigo app = new Trigo("ReportF");
    app.run();
  }

  public void run() {
    setLayout(new BorderLayout());
    addChoice();
    addCanvas();
    addField();
    setSize(600, 400);
    setVisible(true);
  }

  private void addField() {
    Panel p = new Panel();
    p.setLayout(new FlowLayout());
    _currentLabel = new Label();
    _currentLabel.setText(String.format("現在の値: %f", _currentValue));
    p.add(_currentLabel);
    _inputField = new TextField(10);
    p.add(_inputField);
    _button = new Button("変更");
    _button.addActionListener(this);
    p.add(_button);
    add(p, BorderLayout.SOUTH);
  }

  public void actionPerformed(ActionEvent evt) {
    String s = _inputField.getText();
    if (s == null || s.equals("")) {
      return;
    }
    double val = 0.0;
    try {
      val = Double.parseDouble(s);
      _currentValue = val;
      _currentLabel.setText(String.format("現在の値: %f", _currentValue));
      _myCanvas.updateMult(_currentValue);
    }
    catch (NumberFormatException e) {
    }
    _inputField.setText("");
  }

  private void addChoice() {
    Choice choice = new Choice();
    choice.add("Select");
    choice.add("sin");
    choice.add("cos");
    choice.add("tan");
    add(choice, BorderLayout.NORTH);
    choice.addItemListener(this);
  }

  private void addCanvas() {
    add(_myCanvas, BorderLayout.CENTER);
  }

  public void itemStateChanged(final ItemEvent itemEvent) {
    if (itemEvent.getItemSelectable() instanceof Choice) {
      Choice c = (Choice)itemEvent.getItemSelectable();
      String selected = c.getSelectedItem();
      if (selected.equals("Select")) {
        _myCanvas.drawNoSelect();
      }
      else if (selected.equals("sin")) {
        _myCanvas.drawSin(_currentValue);
      }
      else if (selected.equals("cos")) {
        _myCanvas.drawCos(_currentValue);
      }
      else if (selected.equals("tan")) {
        _myCanvas.drawTan(_currentValue);
      }
      else {
      }
    }
  }
}

class MyCanvas extends Canvas {
  private static final int NO_SELECT = 0;
  private static final int SIN = 1;
  private static final int COS = 2;
  private static final int TAN = 3;

  private int _state;
  private double _mult;

  MyCanvas() {
    super();
    _state = NO_SELECT;
    _mult = 1;
  }

  public void drawNoSelect() {
    _state = NO_SELECT;
    repaint();
  }

  public void drawSin(double mult) {
    _state = SIN;
    _mult = mult;
    repaint();
  }

  public void drawCos(double mult) {
    _state = COS;
    _mult = mult;
    repaint();
  }

  public void drawTan(double mult) {
    _state = TAN;
    _mult = mult;
    repaint();
  }

  public void paint(Graphics g) {
    int startX = 30;

    if (_state == NO_SELECT) {
      drawAxes(g, startX);
      return;
    }

    Dimension d = getSize();
    int w = d.width * 9 / 10 - 1;
    double delta = 4 * Math.PI / (w - startX);
    double magnification = d.height * 9 / 10 / 2;
    if (_state == SIN) {
      drawSin(g, startX, w, delta, magnification);
    }
    else if (_state == COS) {
      drawCos(g, startX, w, delta, magnification);
    }
    else if (_state == TAN) {
      drawTan(g, startX, w, delta, magnification);
    }
  }

  public void drawSin(Graphics g, int startX, int width, double delta, double magnification) {
    drawAxes(g, startX);
    int centerY = getSize().height / 2;
    double r = 0.0;
    for (int i = 0; i < width - startX; i++, r += delta) {
      int x = i + startX;
      int y1 = centerY - (int)(Math.sin(r * _mult) * magnification);
      int y2 = centerY - (int)(Math.sin(r * _mult + delta) * magnification);
      g.drawLine(x, y1, x + 1, y2);
    }
  }

  public void drawCos(Graphics g, int startX, int width, double delta, double magnification) {
    drawAxes(g, startX);
    int centerY = getSize().height / 2;
    double r = 0.0;
    for (int i = 0; i < width - startX; i++, r += delta) {
      int x = i + startX;
      int y1 = centerY - (int)(Math.cos(r * _mult) * magnification);
      int y2 = centerY - (int)(Math.cos(r * _mult + delta) * magnification);
      g.drawLine(x, y1, x + 1, y2);
    }
  }

  public void drawTan(Graphics g, int startX, int width, double delta, double magnification) {
    drawAxes(g, startX);
    int centerY = getSize().height / 2;
    double r = 0.0;
    for (int i = 0; i < width - startX; i++, r += delta) {
      int x = i + startX;
      int y1 = centerY - (int)(Math.tan(r * _mult) * magnification);
      int y2 = centerY - (int)(Math.tan(r * _mult + delta) * magnification);
      g.drawLine(x, y1, x + 1, y2);
    }
  }

  private void drawAxes(Graphics g, int startX) {
    Dimension d = getSize();
    int y = d.height / 2;
    int height = d.height * 9 / 10;
    g.drawLine(startX, y, d.width, y);
    g.drawLine(startX, y - height / 2, startX, y + height / 2);
  }

  public void updateMult(double mult) {
    _mult = mult;
    repaint();
  }
}



Create a new paste based on this one


Comments: