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