// // Heat1d_all.java // import java.applet.*; import java.awt.*; import java.awt.event.*; /* <applet code ="Heat1d_all" width=800 height=600> </applet> */ public class Heat1d_all extends Applet implements ActionListener, ItemListener, Runnable { public int N = 20; public double lambda = 0.5; public double Tmax = 0.5; public double theta =0.5; public double A = 0.0; public double B = 0.0; public int erabuBC = 0; public int erabuF = 0; public int anime = 0; // ユーザーとのインターフェイス public Label labelLambda, labelN, labelTmax, labelTheta, labelA, labelB, labelanime; public TextField inputLambda, inputN, inputTmax, inputTheta, inputA, inputB; public Button startB; public Choice DirOrNeu, fchoi, animechoi; // 差分法による熱方程式シミュレーション public HeatCanvas_all c1; public Thread th; public void init() { //画面のレイアウト、レイアウトマネージャーの設定 setLayout(new BorderLayout()); //Northパネルの設定(入力フォーム) Panel pn = new Panel(); //North-Westパネルの設定(Dirichlet or Neumann choice) Panel pnw = new Panel(); pnw.setLayout(new GridLayout(2,1)); DirOrNeu = new Choice(); DirOrNeu.addItem("Dirichlet B C"); DirOrNeu.addItem("Neumann B C"); DirOrNeu.addItem("Neumann & Dirichlet B C"); DirOrNeu.addItem("Dirichlet & Neumann B C"); DirOrNeu.addItemListener(this); pnw.add(DirOrNeu); fchoi = new Choice(); fchoi.addItem("f(x) | {x(0<x<0.5), 1-x(0.5<x<1.0)}"); fchoi.addItem("f(x)=1.0"); fchoi.addItem("f(x)=sin2πx"); fchoi.addItemListener(this); pnw.add(fchoi); pn.add(pnw, "West"); //North-Centerパネルの設定 Panel pnc = new Panel(); pnc.setLayout(new GridLayout(6,2)); //テキストフィールドの準備 String s1 = "lambda (should be <= 1/2)"; labelLambda = new Label(s1, Label.LEFT); pnc.add(labelLambda); inputLambda = new TextField("" + lambda,10); pnc.add(inputLambda); labelN = new Label("N", Label.LEFT); pnc.add(labelN); inputN = new TextField("" + N,10); pnc.add(inputN); labelTmax = new Label("Tmax", Label.LEFT); pnc.add(labelTmax); inputTmax = new TextField("" + Tmax,10); pnc.add(inputTmax); String s2 = "theta (0.0 <= theta <= 1.0)"; labelTheta = new Label(s2, Label.LEFT); pnc.add(labelTheta); inputTheta = new TextField("" + theta,10); pnc.add(inputTheta); labelA = new Label("A", Label.LEFT); pnc.add(labelA); inputA = new TextField("" + A,10); pnc.add(inputA); labelB = new Label("B", Label.LEFT); pnc.add(labelB); inputB = new TextField("" + B,10); pnc.add(inputB); inputLambda.addActionListener(this); inputN.addActionListener(this); inputTmax.addActionListener(this); inputTheta.addActionListener(this); inputA.addActionListener(this); inputB.addActionListener(this); pn.add(pnc, "Center"); add(pn, "North"); //North-Eastパネルの設定 Panel pne = new Panel(); pne.setLayout(new GridLayout(2,1)); labelanime = new Label("Anime", Label.LEFT); pne.add(labelanime); animechoi = new Choice(); animechoi.addItem("OFF"); animechoi.addItem("ON(fast)"); animechoi.addItem("ON(normal)"); animechoi.addItem("ON(slow)"); animechoi.addItem("ON(super slow)"); animechoi.addItemListener(this); pne.add(animechoi); pn.add(pne, "East"); add(pn, "North"); //Centerパネルの設定 Panel pc = new Panel(); c1 = new HeatCanvas_all(); c1.setSize(400,400); pc.add(c1); add(pc,"Center"); //Eastパネルの設定 Panel pe = new Panel(); startB = new Button("Restart"); pe.add(startB); add(pe,"East"); startB.addActionListener(this); //スレッドの作成、開始 th = new Thread(this); th.start(); } // init の終了 //スレッドの実行 public void run(){ c1.compute(lambda, N, Tmax, theta, A, B, erabuBC, erabuF, anime); } //イベント処理(ボタン) public void actionPerformed(ActionEvent e) { if (e.getSource() == startB) { String str1 = inputLambda.getText().trim(); String str2 = inputN.getText().trim(); String str3 = inputTmax.getText().trim(); String str4 = inputTheta.getText().trim(); String str5 = inputA.getText().trim(); String str6 = inputB.getText().trim(); lambda = Double.valueOf(str1).doubleValue(); N = Integer.parseInt(str2); Tmax = Double.valueOf(str3).doubleValue(); theta = Double.valueOf(str4).doubleValue(); A = Double.valueOf(str5).doubleValue(); B = Double.valueOf(str6).doubleValue(); c1.compute(lambda, N, Tmax, theta, A, B); } } //イベント処理2(チョイス) public void itemStateChanged(ItemEvent e) { if (e.getSource() == DirOrNeu) { erabuBC = DirOrNeu.getSelectedIndex(); c1.compute(lambda, N, Tmax, theta, A, B, erabuBC); } if (e.getSource() == fchoi) { erabuF = fchoi.getSelectedIndex(); c1.compute(lambda, N, Tmax, theta, A, B, erabuBC, erabuF); } if (e.getSource() == animechoi) { anime = animechoi.getSelectedIndex(); if (anime == 4) { anime = anime * 3; } c1.compute(lambda, N, Tmax, theta, A, B, erabuBC, erabuF, anime); } } }