JAVA+SWINGでGUIアプリケーションを作成中。パネル切替の独立したクラスの記述方法について

このQ&Aのポイント
  • 現在JAVA+SWINGでGUIアプリケーションを作成中。JPanelのレイアウトマネージャーCardLayoutを使用し、パネルの切り替え機能を実装中。
  • 現在は一つのメインclassにすべてのパネルのパラメーターを記述しているが、オブジェクト指向に沿ったクラスの組み合わせで実装したい。
  • しかし、子classのActionイベントで親のパネルに指示を出す方法がわからない状況。実装方法についてアドバイスを求めています。
回答を見る
  • ベストアンサー

現在JAVA+SWINGでGUIアプリケーションを作成しています。

現在JAVA+SWINGでGUIアプリケーションを作成しています。 JPanelのレイアウトマネージャーCardLayoutで10枚程度のページを作成し、パネル上のボタンをクリックすると次のページにジャンプする機能を実装中です。 いまのところパネル上のボタンをクリックし、パネル遷移をさせる方法として、一つのメインclassにパネルのすべてのパラメーターを記述しています(要はそのアプリはいまのところ、一つのjavaファイル) 希望としてはオブジェクト指向らしく、複数のクラスの組み合わせでつくりたい(それぞれのパネルは独立したclassでメインclassはパネルclassの呼び出しだけ)のですが、ページの切替Actionを独立したクラスにどのように記述すればよいのかわからない状態です。 構成 mainFrame mainPanel(CardLayout) subPanel01 button01(ボタンをクリックするとmainPanel上のsubPanel02へ切り替わる) subPanel02 button02(ボタンをクリックするとmainPanel上のsubPanel01へ切り替わる) やりたいこと subPanel01とbutton01を別のjavaファイル(class)として分け、mainPanelにはclassの呼び出しただけで、構成管理を簡略化したい 上記のことを実装しようとすると。子classのActionイベントで親のパネルに指示を出せないとパネルが切り替わらないとおもうのですが、このような実装は可能でしょうか? 初心者で申し訳ございませんが、宜しくお願いします。

  • Java
  • 回答数1
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.1

 こんにちは。  要するに、mainFrame への参照がなくて困るということですよね。  参照を渡してあげればいいんじゃないでしょうか。 class SubPanel01 extends JPanel {   MainFrame frame;   public SubPanel(MainFrame frame) {     this.frame = frame;   }   ・・・ }  で、ボタンのアクションリスナーでは、 public void actionPerformed(ActionEvent e) {   frame.mainPanel.cardLayout.next(frame.mainPanel); }  なんか、こんな感じで・・・。  もし、SubPanel01 を、もっと汎用性の高い独立したコンポーネントにしたいのなら、これじゃだめですが、単に構成管理を簡略化したいだけなら、これで十分なんじゃないですかね。

casualbaby
質問者

お礼

ご助言ありがとうございます。 なるほどFrame自体の参照をsubPanelに投げてやるということですね。 早速実行してみます。

関連するQ&A

  • C++でGUIアプリケーションを作成するには?

    C++でGUIアプリケーションを開発しようとしていますが、どのように作成すればよいのかわからなかったため、質問させて頂きました。 アプリケーションのイメージとしては、ボタン・背景などはすべてこちらの用意した画像で表示し、Windowsっぽいテイストは一切出さないアプリケーションです。ボタンを押すと画面全体が切り替わるイメージです(例えばプリクラみたいな) 現在JavaのSwingでアプリを作成しており、全体が切り替わる機能としてはJPanelのCardLayoutを使用しています。 ボタンはJButton等で完全に画像onlyのアプリを実現しています。 ただ、JavaはWEBカメラからの画像取得が640*480が限界であり、カメラの限界性能(1600*1200等)が使用できるopencv(c++)で画像キャプチャのところだけ作成しました。 このままアプリ全体はJavaで作成し、画像キャプチャ時はc++のexeを裏で実行させるという方法もあるのですが、言語を統一したほうがいいのではないか?と思ったので現在c++でGUIアプリの作成方法を調べています。 参考になるページもご紹介いただけるとありがたいです。

  • JAVA swingについて

    JAVA swingとAWTのみを使って画面を作成してるのですがうまくエラー<作りたい仕様> ・ポップアップウィンドウの大きさを決めることができる ・自由にボタンを設定できる(大きさ・場所など) ・設定したボタンにアクション設定できる(戻り値もOK) また、今あるフレームの上にパネルをはり、パネルの上にコンポーネントを追加して、エラー発生画面を作る方法でもいいです。 どちらかいい方法やクラスなどを知っていましたらぜひ教えて下さい。

    • ベストアンサー
    • Java
  • sessionの値でボタンを活性・非活性(JSP)

    題記の通りなのですが以下のJSPを <form method="POST" action="TEST">  <% if (errmsg == "") { %> <input type="submit" class="button" value="クリック"> ⇒  ボタン活性  <% } else { %> <input type="submit" class="button" value="クリック"> ⇒  ボタン非活性  <% } %> </form> セッションより渡ってきたエラーメッセージにより ボタンを活性・非活性にするには どのように実装すればよろしいのでしょうか?

  • GUI(Frame)作成について

    javaを勉強しようと思い、参考書付属CDROMからjdk1.3.1_01をインストールした のですが、コマンドラインでのコンパイル、classファイルの実行は出来るのです けどGUI(Frame)を作成する時にコンパイルが出来ません。 「setSizeメソッドがありません」というようなエラーが出ます。 ライブラリが無い、もしくはディレクトリ構成が違うのかと思い、sunのHPからいろいろ 調べたのですがファイル構成がとくに間違っている様子でもなさそうです。 使用しているユーザー環境のシェルプロファイルには以下の記述でパスを通しています。 export JAVA_HOME=/usr/java/jdk1.3.1_01 PATH=$PATH:$JAVA_HOME/bin (redhat7.1にrpmからインストールしました。ディレクトリは/usr/java/jdk1.3.1_01/ です。インストール方法とパスの記述は参考書にあったものと同様にしました。) GUIの作成に何か他に必要なものがあるのでしょうか。または各種設定等に問題が あるのでしょうか。どなたか助言、御指摘いただければ、と思います。 ちなみにファイル構成の確認は下記のページを参照しました。 http://java.sun.com/j2se/1.3/ja/docs/ja/tooldocs/linux/jdkfiles.html

    • ベストアンサー
    • Java
  • Netbeans6 swingでの画面切替について

    Netbeans6 swingでGUIアプリを作成しようとしています。 swingは初心者です。 簡単な画面切替ができず、理解に困っています。 画面構成 ・画面1 ・画面2 目的:画面1のボタンを押されると画面2を表示したい。 構成 ・MainFlame.java ⇒ フレームと画面1(パネルを定義) ・Panel01.java ⇒ 画面2(パネル) 今後、ログイン⇒メニュー⇒入力画面(複数)といった具合にしたいので、1画面1クラスで行いたいです。 こういった場合どうすれば画面がきりかわるのでしょうか? よろしくお願いします。 ボタンクリック時のイベント部分にはこう書いてますが動きません。 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: remove(jPanel1); Panel01 panel = new Panel01(); add(panel); validate(); }

    • ベストアンサー
    • Java
  • 現在作成しているページで、一部をPHPで記述するようにしているのですが

    現在作成しているページで、一部をPHPで記述するようにしているのですが、 一度記述したPHPの部分のみをボタンをクリックしたら削除して 新たなPHPを呼び出したいと考えています。 HTMLソースを表示します。 <div class="box009"> <div class="box009inner"> <div class="box009m"> <?php require_once("./work/twitter.php"); twitter_serch(jsports,20); ?> <p class="mt10"><a href="#"><img src="img/button005.gif" width="629" height="40" alt="もっと読む" /></a></p> </div><!-- /box009m --> </div><!-- /box009inner --> </div><!-- /box009 --> このPHPの部分で記述している部分のみを削除したいのですが、 その場合はどのように記述すればよいでしょうか? よろしくお願いします。

  • CardLayoutに関する質問です

    前回、swingに関する質問をさせていただいたものです。 前回頂いたご回答をヒントに新しく作り直したのですが、CardLayoutのパネルにFlowLayoutのパネルを追加してもボタンが右端で折り返してくれません。 色々調べたのですが、この二つのレイアウトを使った例が見つかりませんでした。 長文になりますが、以下にソースを記載いたします。 今一度、お知恵をお借りできれば幸いです。 ------------以下ソースコード------------------- import java.io.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.imageio.*; import javax.swing.Timer; class Main extends JPanel implements ActionListener{ static JFrame frame = new JFrame(); String[] imgStr = { "1","2","3","4","5","6","7","8","9", "10","11","12","13","14","15","16","17","18", "19","20","21","22","23","24","25","26","27", "28","29","30","31","32","33","34","35","36", "37","38","39","40","41","42","43","44","45","46","終了"}; JButton[] bt = new JButton[imgStr.length]; JPanel mainPanel = new JPanel(); JPanel btPanel = new JPanel(); JPanel image; MediaTracker tracker; CardLayout cardLayout = new CardLayout(); Image img; ImageCanvas canvas; Timer time = new Timer(0,this); int eventNo = -1; public static void main(String[] args){ frame.add(new Main()); frame.setLayout(new FlowLayout()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(0, 0, 1024, 576); frame.setTitle("タイトル"); frame.setVisible(true); } public Main(){ mainPanel.setLayout(cardLayout); mainPanel.setBounds(0, 0, 1024, 576); btPanel.setBounds(0, 0, 1024, 576); for(int i=0; i<imgStr.length; i++){ bt[i] = new JButton(imgStr[i]); bt[i].setActionCommand(imgStr[i]); bt[i].addActionListener(this); btPanel.add(bt[i]); } btPanel.setLayout(new FlowLayout()); mainPanel.add(btPanel,"bt"); add(mainPanel); } public void actionPerformed(ActionEvent e){ if(e.getActionCommand() == null){ eventNo = -1; }else{ for(int i=0; i<imgStr.length; i++){ if(e.getActionCommand().equals(imgStr[i])){eventNo = i;} } } if(eventNo==-1){ time.stop(); cardLayout.show(mainPanel,"bt"); } if(eventNo==46){ System.exit(0); } if(eventNo>=0){ tracker = new MediaTracker(this); try{ img = ImageIO.read(new File("./image/001.jpg")); tracker.addImage(img, 0); tracker.waitForAll(); canvas = new ImageCanvas(img); mainPanel.setBounds(0, 0, 1024, 576); mainPanel.add(canvas,"img"); cardLayout.show(mainPanel,"img"); time.setInitialDelay(5000); time.start(); }catch(Exception ex){ System.out.println(ex); } } } }

    • ベストアンサー
    • Java
  • JavaのSwingのレイアウト

    Swingを学習中ですが、うまくレイアウトできません。 添付した画像のようなレイアウトにしたいです。 作ってみたものは以下です。 import java.awt.BorderLayout; import java.awt.Color; import javax.swing.*; public class LayoutTest { public static void main(String[] args) { JFrame frame = new JFrame(); JPanel panel = new JPanel(); JTextField searchFiled = new JTextField("テキスト"); String[] comboboxString = {"C", "C++", "Java"}; JComboBox comboBox = new JComboBox(comboboxString); JButton button = new JButton("ボタン"); panel.add(comboBox, BorderLayout.EAST); panel.add(searchFiled, BorderLayout.CENTER); panel.add(button, BorderLayout.WEST); frame.add(panel, BorderLayout.PAGE_START); JPanel redPanel = new JPanel(); redPanel.setBackground(Color.RED); frame.add(redPanel); frame.setSize(700, 500); frame.setLocationRelativeTo(null); frame.setVisible(true); } }

    • ベストアンサー
    • Java
  • JavaのGUIプログラミング

    javaのGUIプログラミングでメニューを作成したのですが、どうしてわからないところがあります。 ルートペインにメニューを追加した後、各々の処理を記述しようとするときに、 ActionListenerを実装したクラスのactionPerformedメソッドでイベントが起きたものをif文で場合分けして、それぞれの処理を記述していますが、これがいい方法だとはどうしても思えません。 自分なり考えた結果、 ・各メニューごとにクラスを作成してそこに処理を書き込む ・匿名のインナークラスを使用する を思いついたのですが、初心者なのでこの場合に応用できません。 分かりにくい文章で申し訳ないのですが、なにかアドバイスをいただけないでしょうか? できれば、参考になるソースをのせてくれると勉強しやすいので助かります。 よろしくお願いします。

    • ベストアンサー
    • Java
  • javaについて

    OSXでjavaゲーム作ろうとしているんですが http://javagame.main.jp/index.php?%A5%A2%A5%D7%A5%EA%A5%B1%A1%BC%A5%B7%A5%E7%A5%F3%A4%CE%B9%BD%C0%AE のHelloWorld.javaとMainPanel.javaができません ターミナルを開いて public class HelloWorld extends JFrame { public HelloWorld() { // タイトルを設定 setTitle("Hello Worldを表示する"); // メインパネルを作成してフレームに追加 MainPanel panel = new MainPanel(); Container contentPane = getContentPane(); contentPane.add(panel); // パネルサイズに合わせてフレームサイズを自動設定 pack(); } public static void main(String[] args) { HelloWorld frame = new HelloWorld(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } と打ち打ち込み HelloWorld.javaで保存して もう一個もMainPanel.javaをMainPanel.javaのコードをコピーしてペーストして保存して よくわからず同じフォルダにいれて javac Helloworldと打ち込んでもエラーがでます もしかしてEclipseをつかってフレームみたいにしなくてはダメなんでしょうか? よくわかりませんがとりあえず javaでゲーム作りますが何か?でゲームが作れるようになりたいです 応用などきかせて 私はいつも出だしで全部 挫折してしまうのでダメです どなたか詳しい方このHelloWorldが出せるまで教えて下さい

    • ベストアンサー
    • Java