1178604313 java 上での GUI プログラムについての質問です。


今まで、同じような質問ばかりしてきましたが、もう一度質問致します。

自分の頭にあることをうまく伝えるために、図を添付しました。

このようなプログラムを作りたいのです。

いろんな方から助言をいただきましたが、どうしても組むことが出来ません。

画面を切り替えることが出来ないのです。(ゲームを作るサイトは多くありましたが、
これには応用できません。)

どこかに、似たようなソースがあれば紹介して下さい。
(1つめの画面でユーザーに入力を促し、2つめの画面で処理状況を逐一伝え、
3つめの画面で完了を伝える。)

ソースだけあれば、あとは根性で読み解こうと思います。

よろしくお願いします。

回答の条件
  • URL必須
  • 1人20回まで
  • 登録:
  • 終了:2007/05/15 15:10:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答5件)

id:soniichi No.1

回答回数18ベストアンサー獲得回数1

ポイント20pt

「java上でのGUIプログラム」が何を指しているのかわかりませんが、Swingでの実装を想定して回答します。(絵がそれっぽかったので)

1. JFrameにJPanelとJTextareaとJButtonを追加して表示。

2. JButtonを押下されたらdisableにしてメインの処理(検索?)開始。

3. 検索の進捗状況を時間や件数などでJTextareaに出力

4. 検索が終了したら、テキストファイルを出力してその旨を同じようにJTextareaに出力して終了。

って感じでどうでしょうか?

>画面を切り替えることが出来ないのです。

添付の図を見る限りでは画面の切り替えというよりかは、テキストエリアの中身を変更していけばいいかなと。

以下が参考になると思います。

http://www.javadrive.jp/tutorial/

id:zachouR

ありがとうございます。

はい、今回のものはテキストエリアの中身を変えれば対応できると思いますが、処理2の時に、あたらしく別のものを入力して貰うときなどにつまづくと思うのです。

実際、ちょっと大きいプログラムになると思うのですが、そのソースを見てみたいのです。(ボタンを押された後の処理も含めて)

それぞれの部品JFrameなどの使い方は大体わかりましたが、それらをどのようにして組み立てればいいのか、その実際にソースを置く全体像の流れが全く頭に入りません。

(処理は大体こんな感じだな、というのはつかめています。)

そこで、大きめのソースを見てみたいのです。

2007/05/08 17:14:14
id:studioes No.2

回答回数523ベストアンサー獲得回数61

ポイント20pt

パネルの入れ替えで対応しましょう。

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);の様な感じの処理です。

http://q.hatena.ne.jp/

id:zachouR

ありがとうございます。

昨日からずっとやっているのですが、

やはり例文となるソースを見てみたいです。

参考になる本などはないでしょうか?単発の短いソースの例文ではなく、長めのソースがのったものはないでしょうか?

もし、よろしければ紹介して頂けないでしょうか?

2007/05/09 13:14:21
id:j7400157 No.3

回答回数7ベストアンサー獲得回数0

ポイント20pt

画面の切り替えがポイントでしたら、CardLayoutを使えば実現できると思います。

以下のサイトで、CardLayoutの解説と、サンプルコードがあります。

http://www.javadrive.jp/tutorial/cardlayout/index2.html

サンプルコードを参考に、JTextareaを配置し、処理を追加すれば希望のプログラムが実装できると思います。

id:zachouR

ありがとうございます。

サンプルコードじっくり見てみます。

当然ボタンを押すとなんらかの行動を起こさせなければいけないと思うのですが、

皆さんはどうしてらっしゃるのでしょうか?

自分の頭ではボタンを押した後、入力された数値をそのまま、別のクラスに渡し、そこで処理をする、ということしか浮かびません、、、。

2007/05/09 13:16:43
id:studioes No.4

回答回数523ベストアンサー獲得回数61

ポイント20pt

長いのでダイアリーの方に入れてみました(手抜きなのでOO的じゃありませんが・・・)

http://d.hatena.ne.jp/studioes/20070509

こんな感じでどうでしょう。

 ボタンの押下は、Panelのイベントハンドラで

 e.arg == "Go"みたいに拾って、イベント処理でMyApp.strに代入、画面遷移を実行。

 アプリケーションのメソッドで、諸々の処理を実装してあれば、ここでMyApp.str=ta.getText()の代わりにMyApp.myMethod(ta.getText())の様にして呼び出したり。

 処理状況をリアルタイムに表示するなら、画面を状態表示画面に切り替えて、処理スレッドを作成し、処理スレッドで状況が変化するとアプリケーションの状態変更メソッドをコールして、状態表示画面に表示する等(直に状態表示画面で処理を進めていくと、ハングしたみたいになるので)

id:zachouR

わざわざ組んで下さるとは!

ありがとうございます、じっくり読ませて頂きます。

少ないですがポイントを送らせて頂きました。

解説も詳細にかいてくださってありがとうございます。


http://q.hatena.ne.jp/1178844774

にて、どなたか30分程教えて頂ける人をさがしているのですが、お願いできないでしょうか?

2007/05/11 12:07:15
id:lunlumo No.5

回答回数107ベストアンサー獲得回数14

ポイント20pt

 質問に答えるとするとこうでしょうか。(理解しやすいコードに落としてあるので,良い子は真似しない様に。)

 以前にもコメントした通り,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/

id:zachouR

ご丁寧にありがとうございます!

ポイントを送信させて頂きました。

じっくり勉強させて頂きたいと思います。

ありがとうございました。

わからない部分があったら、お礼を致しますので個人的に質問してもよろしいでしょうか?

http://q.hatena.ne.jp/1178844774

にて、どなたか30分程教えて頂ける人をさがしているのですが、お願いできないでしょうか?

2007/05/11 12:06:59

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません