宿題スレPart53 >>875-876 †
// Ex8B_3.java
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Container;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.JRadioButton;
import java.awt.Graphics;
import java.awt.FontMetrics;
import javax.swing.BoxLayout;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.ButtonGroup;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JComponent;
import javax.swing.KeyStroke;
import javax.swing.JOptionPane;
import javax.swing.JButton;
import javax.swing.ButtonGroup;
import javax.swing.Timer;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseMotionAdapter;
class Ex8B_3 extends JFrame{
Ex8B_3(){
Ex7B_1 g1 = new Ex7B_1();//Ex7B_1オブジェクトの生成
MenuBar menubar = new MenuBar();//MenuBarオブジェクトの生成
setJMenuBar(menubar); //メニューバーをおく
Container pane = getContentPane();//フレームの内容表示域を得る
pane.setLayout(new BoxLayout(pane,BoxLayout.Y_AXIS));//配置方式の設定
pane.add(g1); //作成したパネルをおく
pack(); //フレームを必要最小の大きさにする
setVisible(true); //フレームを画面に見せる
}
public static void main(String[] args){//メインメソッド
Ex8B_3 frame = new Ex8B_3();//Ex8B_3のオブジェクトを生成
frame.addWindowListener(new WindowAdapter() {//フレームのイベント設定
public void windowClosing(WindowEvent e) {//フレームを閉じたとき
System.exit(0); //終了
}
});
frame.setTitle("Ex8B_3");//タイトルの設定
}
}
class MenuBar extends JMenuBar{
JMenuItem item1,item2; //JMenuItemオブジェクトの宣言
Listener1 listener; //Listener1オブジェクトの宣言
MenuBar(){ //メニューとメニューアイテムを持つメニューバーの作成
listener = new Listener1();//Listener1オブジェクトの生成
JMenu menu1 = new JMenu("ファイル");//JMenuオブジェクトの生成
JMenu menu2 = new JMenu("ヘルプ");//JMenuオブジェクトの生成
item1 = new JMenuItem("終了(Ctrl+Shift+x)");//JMenuItem
//オブジェクトの生成
item2 = new JMenuItem("バージョン情報(Ctrl+Shift+v)");//JMenuItem
//オブジェクトの生成
JMenuItem item1 = new JMenuItem("終了(Ctrl+x)");
JMenuItem item2 = new JMenuItem("バージョン情報(Ctrl+Shift+v)");
item1.setActionCommand("I1");
item2.setActionCommand("I2");
item1.addActionListener(listener);
item2.addActionListener(listener);
item1.setAccelerator(KeyStroke.getKeyStroke("ctrl X"));
item2.setAccelerator(KeyStroke.getKeyStroke("ctrl shift V"));
add(menu1);
add(menu2);
menu1.add(item1);
menu2.add(item2);
}
class Listener1 implements ActionListener{//リスナークラス(内部クラス)
public void actionPerformed(ActionEvent e){//イベントが起きたとき
String str = e.getActionCommand();//識別させたイベントの文字をえる
if(str.compareTo("I1") == 0){//識別の文字が"I1"の場合
System.exit(0); //終了
}else if(str.compareTo("I2") == 0){//識別の文字が"I2"の場合
JOptionPane.showMessageDialog(null, "Ex8B_3"+"?n"+
"produced by "+"?n"+"version 1.0.0", "Version情報"
, JOptionPane.INFORMATION_MESSAGE);//インフォメーション
//メッセージの表示
}
}
}
}
class Ex7B_1 extends JPanel{
Graphinfo graph;//Graphinfoオブジェクトの宣言
GraphPanel graph2;//GraphPanelオブジェクトの宣言
InfoPanel graph3;//InfoPanelオブジェクトの宣言
JPanel p1,p2,p3;//JPanelオブジェクトの宣言
JLabel l7;//JLabelオブジェクトの宣言
Ex7B_1(){ //Ex7B_1パネルの初期状態の設定
setBackground(Color.white);//背景の設定
setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));//配置方式
l7 = new JLabel();//JLabelオブジェクトの生成
graph = new Graphinfo();//Graphinfoオブジェクトの生成
graph2 = new GraphPanel(graph,this);//GraphPanelオブジェクトの生成
graph3 = new InfoPanel(graph,graph2);//InfoPanelオブジェクトの生成
p3 = new JPanel();//JPanelオブジェクトの生成
p3.add(l7);//p3にl7を追加
add(graph3);//graph3追加
add(graph2);//graph2追加
add(p3);//p3追加
}
}
class InfoPanel extends JPanel{//数値入力のパネル
Graphinfo graph; //Graphinfoオブジェクトの宣言
GraphPanel graph2; //GraphPanelオブジェクトの宣言
Listener2 listener2; //Listener2オブジェクトの宣言
JPanel p1; //JPanelオブジェクトの宣言
JTextField txt1,txt2,txt3,txt4,txt5,txt6,txt7,txt8;//JTextFieldオブジェクトの宣言
JLabel l1,l2,l3,l4,l5,l6,l7,l8,l9;//JLabelオブジェクトの宣言
JRadioButton rd1,rd2; //JRadioButtonオブジェクトの宣言
JButton b1,b2; //JButtonオブジェクトの宣言
InfoPanel(Graphinfo g1,GraphPanel g2){//コンストラクタ
graph = g1; //Graphinfoオブジェクトの生成
graph2 = g2; //GraphPanelオブジェクトの生成
listener2 = new Listener2();//Listener2オブジェクトの生成
txt1 = new JTextField(10);//JTextFieldオブジェクトの生成
txt2 = new JTextField(10);//JTextFieldオブジェクトの生成
txt3 = new JTextField(10);//JTextFieldオブジェクトの生成
txt4 = new JTextField(10);//JTextFieldオブジェクトの生成
txt5 = new JTextField(10);//JTextFieldオブジェクトの生成
txt6 = new JTextField(10);//JTextFieldオブジェクトの生成
txt7 = new JTextField(10);//JTextFieldオブジェクトの生成
txt8 = new JTextField(10);//JTextFieldオブジェクトの生成
l1 = new JLabel("分割数:");//JLabelオブジェクトの生成
l2 = new JLabel("関数:");//JLabelオブジェクトの生成
l3 = new JLabel("周期:");//JLabelオブジェクトの生成
l4 = new JLabel("初期位相:");//JLabelオブジェクトの生成
l5 = new JLabel("定義域xの最小値:");//JLabelオブジェクトの生成
l6 = new JLabel("xの最大値:");//JLabelオブジェクトの生成
l7 = new JLabel("速度:");//JLabelオブジェクトの生成
l8 = new JLabel("時間刻み:");//JLabelオブジェクトの生成
l9 = new JLabel("時間ステップ:");//JLabelオブジェクトの生成
b1 = new JButton("スタート");//JButtonオブジェクトの生成
b2 = new JButton("ストップ");//JButtonオブジェクトの生成
rd1 = new JRadioButton("sin",true);//JRadioButtonオブジェクトの生成
rd2 = new JRadioButton("cos");//JRadioButtonオブジェクトの生成
ButtonGroup grp = new ButtonGroup();//ButtonGroupオブジェクトの生成
grp.add(rd1); //ボタングループに登録
grp.add(rd2); //ボタングループに登録
p1 = new JPanel();//JPanelオブジェクトの生成
p1.add(rd1); //パネルにラジオボタンをおく
p1.add(rd2); //パネルにラジオボタンをおく
txt1.addActionListener(listener2);//リスナー登録
txt2.addActionListener(listener2);//リスナー登録
txt3.addActionListener(listener2);//リスナー登録
txt4.addActionListener(listener2);//リスナー登録
txt5.addActionListener(listener2);//リスナー登録
txt6.addActionListener(listener2);//リスナー登録
txt7.addActionListener(listener2);//リスナー登録
txt8.addActionListener(listener2);//リスナー登録
rd1.addActionListener(listener2);//リスナー登録
rd2.addActionListener(listener2);//リスナー登録
b1.addActionListener(listener2);//リスナー登録
b2.addActionListener(listener2);//リスナー登録
setLayout(new GridLayout(5,4));//配置方式
add(l1); //ラベルをおく
add(txt1); //テキストフィールドをおく
add(l2); //ラベルをおく
add(p1); //パネルをおく
add(l3); //ラベルをおく
add(txt2); //テキストフィールドをおく
add(l4); //ラベルをおく
add(txt3); //テキストフィールドをおく
add(l5); //ラベルをおく
add(txt4); //テキストフィールドをおく
add(l6); //ラベルをおく
add(txt5); //テキストフィールドをおく
add(l7); //ラベルをおく
add(txt6); //テキストフィールドをおく
add(l8); //ラベルをおく
add(txt7); //テキストフィールドをおく
add(l9); //ラベルをおく
add(txt8); //テキストフィールドをおく
add(b1); //ボタンをおく
add(b2); //ボタンをおく
}
class Listener2 implements ActionListener{//リスナークラス(内部クラス)
public void actionPerformed(ActionEvent e){//イベントが起きたとき
if(e.getSource() == b1){ //スタートボタンが押された場合
graph2.time1.setDelay((int)(graph.gettxt8()));//時間ステップ
graph2.time1.start(); //アニメーションスタート
}else if (e.getSource() ==b2){//ストップボタンが押された場合
graph2.time1.stop(); //アニメーションストップ
}
float f; //変数の宣言
int RD = 0; //cosかsinかの識別用
try{
f = Float.valueOf(txt1.getText()).floatValue();//得た文字を数
//値に変換
graph.settxt1(f); //数値を別のクラスにいれる
}catch(NumberFormatException e1){}//例外処理
try{
f = Float.valueOf(txt2.getText()).floatValue();//得た文字を数
//値に変換
if(f==0){ //数値が0だった場合
JOptionPane.showMessageDialog(null,
"周期0は禁止です。勝手ながら360にさせて頂きます。",
"Error!",JOptionPane.ERROR_MESSAGE);//エラーメッセージ
//表示
f = 360; //数値を360にする
}
graph.settxt2(f); //数値を別のクラスにいれる
}catch(NumberFormatException e1){}//例外処理
try{
f = Float.valueOf(txt3.getText()).floatValue();//得た文字を数
//値に変換
graph.settxt3(f); //数値を別のクラスにいれる
}catch(NumberFormatException e1){}//例外処理
try{
f = Float.valueOf(txt4.getText()).floatValue();//得た文字を数
//値に変換
graph.settxt4(f); //数値を別のクラスにいれる
}catch(NumberFormatException e1){}//例外処理
try{
f = Float.valueOf(txt5.getText()).floatValue();//得た文字を数
//値に変換
graph.settxt5(f); //数値を別のクラスにいれる
}catch(NumberFormatException e1){}//例外処理
try{
f = Float.valueOf(txt6.getText()).floatValue();//得た文字を数
//値に変換
graph.settxt6(f); //数値を別のクラスにいれる
}catch(NumberFormatException e1){}//例外処理
try{
f = Float.valueOf(txt7.getText()).floatValue();//得た文字を数
//値に変換
graph.settxt7(f); //数値を別のクラスにいれる
}catch(NumberFormatException e1){}//例外処理
try{
f = Float.valueOf(txt8.getText()).floatValue();//得た文字を数
//値に変換
graph.settxt8(f); //数値を別のクラスにいれる
}catch(NumberFormatException e1){}//例外処理
if(e.getSource() == rd1){ //rd1のラジオボタンが選択された場合
RD = 1; //RDに1を代入
graph.setRD(RD); //数値を別のクラスにいれる
}else if(e.getSource() == rd2){//rd2のラジオボタンが選択された場合
RD = 2; ////RDに2を代入
graph.setRD(RD); //数値を別のクラスにいれる
}
graph2.repaint();//再描画
}
}
}
class Graphinfo{//情報を入れておくクラス
private float txt1; //データの初期値
private float txt2 = 360; //データの初期値
private float txt3 = 0; //データの初期値
private float txt4 = 0; //データの初期値
private float txt5 = 360; //データの初期値
private float txt6 = 0; //データの初期値
private float txt7 = 0; //データの初期値
private float txt8 = 1; //データの初期値
int RD = 1; //データの初期値
float gettxt1(){return txt1;}//データを得るメソッド
float gettxt2(){return txt2;}//データを得るメソッド
float gettxt3(){return txt3;}//データを得るメソッド
float gettxt4(){return txt4;}//データを得るメソッド
float gettxt5(){return txt5;}//データを得るメソッド
float gettxt6(){return txt6;}//データを得るメソッド
float gettxt7(){return txt7;}//データを得るメソッド
float gettxt8(){return txt8;}//データを得るメソッド
void settxt1(float TxT1){txt1 = TxT1;}//データの更新メソッド
void settxt2(float TxT2){txt2 = TxT2;}//データの更新メソッド
void settxt3(float TxT3){txt3 = TxT3;}//データの更新メソッド
void settxt4(float TxT4){txt4 = TxT4;}//データの更新メソッド
void settxt5(float TxT5){txt5 = TxT5;}//データの更新メソッド
void settxt6(float TxT6){txt6 = TxT6;}//データの更新メソッド
void settxt7(float TxT7){txt7 = TxT7;}//データの更新メソッド
void settxt8(float TxT8){txt8 = TxT8;}//データの更新メソッド
void setRD(int rd){RD = rd;} //データの更新メソッド
}
class GraphPanel extends JPanel{//グラフを表示するパネル
Graphinfo graph; //Graphinfoオブジェクトの宣言
Ex7B_1 ex7; //Ex7B_1オブジェクトの宣言
float a1,a2,a3,a4,a5; //変数の宣言
int TM; //変数の宣言
float t = 0; //変数の宣言
Listener3 listener; //Listener3オブジェクトの宣言
Listener1 listener2; //Listener3オブジェクトの宣言
Listener4 listener4; //Listener4オブジェクトの宣言
Timer time1;
GraphPanel(Graphinfo g,Ex7B_1 g2){//コンストラクタ
graph = g; //Graphinfoオブジェクトの生成
ex7 = g2; //Ex7B_1オブジェクトの生成
listener = new Listener3();//Listener3オブジェクトの生成
listener2 = new Listener1();//Listener3オブジェクトの生成
listener4 = new Listener4();//Listener4オブジェクトの生成
TM = (int)(graph.gettxt8());//データの取得
time1 = new Timer(TM,listener4);//timer登録
setBackground(Color.white);//背景の設定
setMinimumSize(new Dimension(250,125));//パネルのサイズ設定
setPreferredSize(new Dimension(440,220));//パネルのサイズ設定
addMouseListener(listener);//イベントリスナーに登録
addMouseMotionListener(listener2);//イベントリスナー登録
}
public void paintComponent(Graphics g){//図形と文字を書くメソッドに再定義
double [] x = new double[(int)(graph.gettxt1())+1];//x座標の配列
//(途中計算用)
double [] y = new double[(int)(graph.gettxt1())+1];//y座標の配列
//(途中計算用)
int [] x2 = new int[(int)(graph.gettxt1())+1];//x座標の配列
int [] y2 = new int[(int)(graph.gettxt1())+1];//y座標の配列
super.paintComponent(g);//親クラスのメソッドの使用
Dimension d = getSize();//ウィンドウサイズの取得
double z = (d.width-40)/(Math.PI*(graph.gettxt5()-graph.gettxt4())/180);
//定義域の調整
if(graph.RD == 1){//sinの場合
for(int i =0;i<=graph.gettxt1();i++){//iが0からtxt1までの間繰り返し
x[i] = (Math.PI*(graph.gettxt5()-graph.gettxt4())/180)*i
/graph.gettxt1();//x座標の計算
y[i] = Math.sin(2*Math.PI/(Math.PI*graph.gettxt2()/180)*(x[i]
-(Math.PI*graph.gettxt6()*t/180)+(Math.PI*graph.gettxt4()
/180)+(Math.PI*graph.gettxt3()/180)));//y座標の計算
x2[i] = (int)(z*x[i]+20);//x座標
y2[i] = (int)(-y[i]*(d.height-40)/2+(d.height-40)/2+20);//y座標
}
}else if(graph.RD == 2){//cosの場合
for(int i =0;i<=graph.gettxt1();i++){//iが0からtxt1までの間繰り返し
x[i] = (Math.PI*(graph.gettxt5()-graph.gettxt4())/180)*
i/graph.gettxt1();//x座標の計算
y[i] = Math.cos(2*Math.PI/(Math.PI*graph.gettxt2()/180)*(x[i]
-(Math.PI*graph.gettxt6()*t/180)+(Math.PI*graph.gettxt4()
/180)+(Math.PI*graph.gettxt3()/180)));//y座標の計算
x2[i] = (int)(z*x[i]+20);//x座標
y2[i] = (int)(-y[i]*(d.height-40)/2+(d.height-40)/2+20);//y座標
}
}
for(int j =0;j<graph.gettxt1();j++){//jが0からtxt1までの間繰り返し
g.drawLine(x2[j],y2[j],x2[j+1],y2[j+1]);//線を描画
}
g.drawRect(20,20,(d.width-40),(d.height-40));//枠を描画
g.drawLine(20,d.height/2,d.width-20,d.height/2);//y=0の線の描画
g.drawLine(d.width/2,d.height/2-10,d.width/2,d.height/2+10);//目盛り
//の描画
g.setFont(new Font("TimesRoman",Font.ITALIC,10));//フォントの設定
FontMetrics metrics = g.getFontMetrics();//FontMetricsオブジェクトの生
String string1 = "1.0";//文字列の作成
int ascent = metrics.getAscent();//文字の高さの測定
int width1 = metrics.stringWidth(string1);//文字の幅の測定
String string2 = Float.toString(graph.gettxt4());//文字列の作成
String string3 = "-1.0";//文字列の作成
String string4 = Float.toString(graph.gettxt5());//文字列の作成
int width2 = metrics.stringWidth(string2);//文字の幅の測定
int width3 = metrics.stringWidth(string3);//文字の幅の測定
int width4 = metrics.stringWidth(string4);//文字の幅の測定
g.drawString(string1,0,20);//文字を書く
g.drawString(string2,0,d.height/2+ascent);//文字を書く
g.drawString(string3,0,d.height-20+ascent);//文字を書く
g.drawString(string4,d.width-20-15,d.height/2+ascent);//文字を書く
}
class Listener3 extends MouseAdapter{//リスナークラス(内部クラス)
public void mouseClicked(MouseEvent e){//マウスがクリックされた場合
if(javax.swing.SwingUtilities.isLeftMouseButton(e)){//クリックさ
//れたのが左
//ボタンの場合
float f1 = (graph.gettxt5()-graph.gettxt4())/2+graph.gettxt4();
//定義域調整
graph.settxt5(f1); //数値を別のクラスにいれる
repaint(); //再描画
}else if(javax.swing.SwingUtilities.isRightMouseButton(e)){
//クリックされたのが
//右ボタンの場合
float f2 = (graph.gettxt5()-graph.gettxt4())*2+graph.gettxt4();
//定義域調整
graph.settxt5(f2); //数値を別のクラスにいれる
repaint(); //再描画
}
}
}
class Listener1 extends MouseMotionAdapter{//リスナークラス(内部クラス)
public void mouseMoved(MouseEvent e){//マウスが動くときのメソッド
Dimension d = getSize();//パネルの大きさをえる
float a5 = graph.gettxt5();//グラフのx最大値
float a4 = graph.gettxt4();//グラフのx最小値
float y1 = d.height; //パネルの高さ
float X1 = (e.getX()-20)*(a5-a4)/(d.width-40)+a4;//ポインタのx座標
float Y1 = (y1/2-e.getY())/((d.height-40)/2);//ポインタのy座標
ex7.l7.setText("("+X1+","+Y1+")");//位置表示
}
}
class Listener4 implements ActionListener{//リスナークラス(内部クラス)
public void actionPerformed(ActionEvent e){//イベントが起きた場合
t = t+graph.gettxt7(); //更新式
repaint(); //再描画
}
}
}
CONTENTS
最新の20件
2020-11-14
2005-12-06
2006-11-04
2012-07-15
2009-06-19
2011-03-03
2006-12-13
2007-11-05
2014-07-22
2014-07-19
2014-07-09
2014-01-14
2012-09-03
2012-03-28
今日の11件
人気の30件
- counter: 2412
- today: 1
- yesterday: 2
- online: 1