今まで、同じような質問ばかりしてきましたが、もう一度質問致します。
自分の頭にあることをうまく伝えるために、図を添付しました。
このようなプログラムを作りたいのです。
いろんな方から助言をいただきましたが、どうしても組むことが出来ません。
画面を切り替えることが出来ないのです。(ゲームを作るサイトは多くありましたが、
これには応用できません。)
どこかに、似たようなソースがあれば紹介して下さい。
(1つめの画面でユーザーに入力を促し、2つめの画面で処理状況を逐一伝え、
3つめの画面で完了を伝える。)
ソースだけあれば、あとは根性で読み解こうと思います。
よろしくお願いします。
「java上でのGUIプログラム」が何を指しているのかわかりませんが、Swingでの実装を想定して回答します。(絵がそれっぽかったので)
1. JFrameにJPanelとJTextareaとJButtonを追加して表示。
2. JButtonを押下されたらdisableにしてメインの処理(検索?)開始。
3. 検索の進捗状況を時間や件数などでJTextareaに出力
4. 検索が終了したら、テキストファイルを出力してその旨を同じようにJTextareaに出力して終了。
って感じでどうでしょうか?
>画面を切り替えることが出来ないのです。
添付の図を見る限りでは画面の切り替えというよりかは、テキストエリアの中身を変更していけばいいかなと。
以下が参考になると思います。
パネルの入れ替えで対応しましょう。
Javaアプリの画面は・・・
TextArea < Panel < Frame みたいな構成になっています。
Frameとテキストエリアやボタンなどの間にPanelが存在できるので、このPanelを機能毎に作っておいて、Panelを差し替えます。
FrameをMainFrameとして作成し、入力パネルInputPanelと出力OutputPanelを持つとして・・・
MainFrame.changePanel(Panel panel)の様なメソッドを用意して、InputPanelからOutputPanelに移動する場合に、
MainFrame.changePanel(OutputPanel)の様にして遷移します。
changePanel自体は、MainFrame.removeAll(); MainFrame.add(panel);の様な感じの処理です。
ありがとうございます。
昨日からずっとやっているのですが、
やはり例文となるソースを見てみたいです。
参考になる本などはないでしょうか?単発の短いソースの例文ではなく、長めのソースがのったものはないでしょうか?
もし、よろしければ紹介して頂けないでしょうか?
画面の切り替えがポイントでしたら、CardLayoutを使えば実現できると思います。
以下のサイトで、CardLayoutの解説と、サンプルコードがあります。
http://www.javadrive.jp/tutorial/cardlayout/index2.html
サンプルコードを参考に、JTextareaを配置し、処理を追加すれば希望のプログラムが実装できると思います。
ありがとうございます。
サンプルコードじっくり見てみます。
当然ボタンを押すとなんらかの行動を起こさせなければいけないと思うのですが、
皆さんはどうしてらっしゃるのでしょうか?
自分の頭ではボタンを押した後、入力された数値をそのまま、別のクラスに渡し、そこで処理をする、ということしか浮かびません、、、。
長いのでダイアリーの方に入れてみました(手抜きなのでOO的じゃありませんが・・・)
http://d.hatena.ne.jp/studioes/20070509
こんな感じでどうでしょう。
ボタンの押下は、Panelのイベントハンドラで
e.arg == "Go"みたいに拾って、イベント処理でMyApp.strに代入、画面遷移を実行。
アプリケーションのメソッドで、諸々の処理を実装してあれば、ここでMyApp.str=ta.getText()の代わりにMyApp.myMethod(ta.getText())の様にして呼び出したり。
処理状況をリアルタイムに表示するなら、画面を状態表示画面に切り替えて、処理スレッドを作成し、処理スレッドで状況が変化するとアプリケーションの状態変更メソッドをコールして、状態表示画面に表示する等(直に状態表示画面で処理を進めていくと、ハングしたみたいになるので)
わざわざ組んで下さるとは!
ありがとうございます、じっくり読ませて頂きます。
少ないですがポイントを送らせて頂きました。
解説も詳細にかいてくださってありがとうございます。
http://q.hatena.ne.jp/1178844774
にて、どなたか30分程教えて頂ける人をさがしているのですが、お願いできないでしょうか?
質問に答えるとするとこうでしょうか。(理解しやすいコードに落としてあるので,良い子は真似しない様に。)
以前にもコメントした通り,GUIアプリとしては余り良い設計ではないですね。
import java.awt.*; import java.awt.event.*; import javax.swing.*; class SampleModel { private String search; private String result; public void setSearch(String value) { search=value; } public String getSearch() { return search; } public void setResult(String value) { result=value; } public String getResult() { return result; } } abstract class AbstractSampleFrame extends JFrame { private SampleModel model; public AbstractSampleFrame(String title) { super(title); } public void setModel(SampleModel value) { model=value; } public SampleModel getModel() { return model; } abstract void initializeComponents(); } class SearchFrame extends AbstractSampleFrame implements ActionListener { private JTextArea textSearch; private JButton buttonSearch; public SearchFrame() { super("SampleFrame"); } public void initializeComponents() { Container contentPane; textSearch = new JTextArea(getModel().getSearch(),3,30); buttonSearch = new JButton("search"); buttonSearch.addActionListener(this); contentPane = this.getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add("Center",textSearch); contentPane.add("South",buttonSearch); this.pack(); } public void actionPerformed(ActionEvent e) { SwingUtilities.invokeLater(new Runnable() { public void run() { ResultFrame frame; SampleModel model = getModel(); frame = new ResultFrame(); model.setSearch(textSearch.getText()); frame.setModel(model); frame.initializeComponents(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(false); frame.setVisible(true); dispose(); } }); } } class ResultFrame extends AbstractSampleFrame { private JTextArea textSearch; private JTextArea textResult; private JButton buttonOutput; public ResultFrame() { super("ResultFrame"); } public void initializeComponents() { Container contentPane; SampleModel model = getModel(); model.setResult("dummy result."); textSearch = new JTextArea(model.getSearch(),3,30); textSearch.setEnabled(false); textResult = new JTextArea(model.getResult(),3,30); textResult.setEnabled(false); buttonOutput = new JButton("output"); buttonOutput.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { SwingUtilities.invokeLater(new Runnable() { public void run() { OutputFrame frame; frame = new OutputFrame(); frame.setModel(getModel()); frame.initializeComponents(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(false); frame.setVisible(true); dispose(); } }); } }); contentPane = this.getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add("North",textSearch); contentPane.add("Center",textResult); contentPane.add("South",buttonOutput); this.pack(); } } class OutputFrame extends AbstractSampleFrame { private JTextArea textMessage; private JButton buttonBack; public OutputFrame() { super("OutputFrame"); } public void initializeComponents() { Container contentPane; textMessage = new JTextArea("",3,30); textMessage.setEnabled(false); textMessage.setText("output complete."); buttonBack = new JButton("back"); buttonBack.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { SwingUtilities.invokeLater(new Runnable() { public void run() { SearchFrame frame; frame = new SearchFrame(); frame.setModel(getModel()); frame.initializeComponents(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(false); frame.setVisible(true); dispose(); } }); } }); contentPane = this.getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add("Center",textMessage); contentPane.add("South",buttonBack); this.pack(); } } public class Sample { public static void main(String[] args) { SearchFrame frame; frame = new SearchFrame(); frame.setModel(new SampleModel()); frame.initializeComponents(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }
ご丁寧にありがとうございます!
ポイントを送信させて頂きました。
じっくり勉強させて頂きたいと思います。
ありがとうございました。
わからない部分があったら、お礼を致しますので個人的に質問してもよろしいでしょうか?
http://q.hatena.ne.jp/1178844774
にて、どなたか30分程教えて頂ける人をさがしているのですが、お願いできないでしょうか?
ありがとうございます。
はい、今回のものはテキストエリアの中身を変えれば対応できると思いますが、処理2の時に、あたらしく別のものを入力して貰うときなどにつまづくと思うのです。
実際、ちょっと大きいプログラムになると思うのですが、そのソースを見てみたいのです。(ボタンを押された後の処理も含めて)
それぞれの部品JFrameなどの使い方は大体わかりましたが、それらをどのようにして組み立てればいいのか、その実際にソースを置く全体像の流れが全く頭に入りません。
(処理は大体こんな感じだな、というのはつかめています。)
そこで、大きめのソースを見てみたいのです。