質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.98%

Java GUI メニュー ―> 設定画面

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,590

Puhu

score 29

現在、java でGUIを用いた簡単なプログラムを作成しています。
設定画面として各種設定を押したら新しいフレームを開き、その中でいろいろな設定をさせたいと思っています。
Jmenuでメニューを実装し、メニューアイテムとして"各種設定"というものを用意したところまではいいのですが
各種設定のボタンを押して、フレームこそ開くものの、用意したはずのボタンやテキストエリアが表示されず、フレームだけ表示される、という状態になっています。
そもそも、各種設定画面はフレームを用意するやり方ではよくないのか、ただ単純に私のプログラムがおかしいのか、どなたか教えて頂けると助かります。

プログラムの機能としては、
実行すると、プログラム名と作者名を入力する欄があり、内容を入力して、作成ボタンを押すと
/*
  プログラム名
今日の日付(曜日) 作者名
*/
とコメント文で記述されたjavaファイルが作成される、というものです。

設定画面で、作者名を毎回入力するのではなく、一度設定で入力すればずっと適用されるようにしたり、プログラムの作成先等を設定させたいと考えていますが、上記のような状態で実装できていません。
下にソースを載せますので、お願いいたします。



import java.io.File;
import java.io.IOException;
import java.io.FileWriter;
import java.util.*;
import java.util.Scanner;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JLabel;
import java.awt.Container;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.BoxLayout;
import javax.swing.Box;



public class mendo3 extends JFrame implements ActionListener{

    JTextField text1;
    JTextField text2;
    JLabel label;

  public static void main(String args[]){
    mendo3 frame = new mendo3("カダイマン");
    frame.setVisible(true);
  }    
        
    mendo3(String title){
            setTitle(title);
        setBounds(100,100, 700, 500);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
            JMenuBar menubar = new JMenuBar();
        JMenu menu1 = new JMenu("設定");
        menubar.add(menu1);

        JMenuItem menuitem1 = new JMenuItem("各種設定");
        menu1.add(menuitem1);
        menuitem1.addActionListener(this);
            
            JPanel p = new JPanel();
            p.setLayout(null);
        
        JLabel label1 = new JLabel("プログラム名:");
        label1.setBounds(0,10,150,30);
        
           text1 = new JTextField("", 20);
           text1.setBounds(100,10,200,30);
           
           JLabel label2 = new JLabel(" 作成者氏名:");
        label2.setBounds(0,50,150,30);
           
        text2 = new JTextField("", 20);
        text2.setBounds(100,50,200,30);
        
        
        JButton button = new JButton("作成");
        button.setBounds(230,100,70,30);
        
        button.addActionListener(this);
        label = new JLabel();
        
        
        p.add(text1);
        p.add(text2);
        p.add(label1);
        p.add(label2);
        p.add(button);
        setJMenuBar(menubar);
        
        Container contentPane = getContentPane();
        contentPane.add(p, BorderLayout.CENTER);
        contentPane.add(label, BorderLayout.SOUTH);

    }
    
    public void actionPerformed(ActionEvent e){
    
    if (e.getActionCommand() == "作成"){
        String programName = text1.getText();
        String youName = text2.getText();
        
        File newfile = new File(programName+".java");//mendo.java のある場所にファイルを作成する
        Calendar now = Calendar.getInstance(); 
        
         String[] week = new String[7];
         week[0] = "日";
         week[1] = "月";
         week[2] = "火";
         week[3] = "水";
         week[4] = "木";
         week[5] = "金";
         week[6] = "土";
        int y = now.get(now.YEAR);          //年を取得
        int m = now.get(now.MONTH) + 1;     //月を取得
        int d = now.get(now.DATE);          //日を取得
        int week_int = now.get(now.DAY_OF_WEEK);//曜日を数値で取得

        try{
            if(newfile.createNewFile()){
                System.out.println("successed");
                FileWriter filewriter = new FileWriter(newfile);    
                filewriter.write("/********\r\n");
                filewriter.write(" "+programName+"\r\n");
                filewriter.write(y+"/"+m+"/"+d+" ("+week[week_int -1]+") "+youName+"\r\n");
                filewriter.write("*******+++**/\r\n\r\n\r\n");
                filewriter.close();
            }else{
                System.out.println("Error!");
            }
        }catch(IOException ee){
            System.out.println(ee);
        }
    }else if(e.getActionCommand() == "各種設定"){
        JFrame frames = new JFrame("各種設定");
        frames.setVisible(true);
        frames.setBounds(100,100, 700, 500);

            JPanel p = new JPanel();
            p.setLayout(null);
        
        JLabel label2 = new JLabel(" 作成者氏名:");
        label2.setBounds(0,50,150,30);
           
        text2 = new JTextField("", 20);
        text2.setBounds(100,50,200,30);
        
        p.add(label2);
        p.add(text2);
        
        Container contentPane = getContentPane();
        contentPane.add(p, BorderLayout.CENTER);
        

      }
  }
  
}


  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

最後の方のここ↓は、親のフレームのgetContentPane()を呼び出していますね。
Container contentPane = getContentPane();


ちなみに、Java5以降なら、contentPaneは不要です。
単に

frames.add(p);

でもできます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/03 19:52

    お早いお返事ありがとうございます! なるほど、状態遷移だけのほうが良さそうですね。
    その場合はpackage化させてプログラム単位同士でくっつけたほうがよいでしょうか?

    キャンセル

  • 2016/01/03 20:21

    > package化させてプログラム単位同士でくっつけたほうが

    すみません、これがどういう状態を指しているのかよく分からないです。
    Javaはかなり前にデフォルトパッケージを非推奨にしていますので、クラスが複数になる場合はパッケージに含めたほうが良いです。
    練習の場合はなくても良いですけどね。何か公開するものを作るのでしたら、パッケージに入れたほうが無難です。

    あと、レイアウトや設定はコンポーネントのコンストラクターにまとめて、状態遷移はコンポーネントとは別のクラスで行う(そこにtop frameとかJFrame framesをまとめる)のが良いかも知れません。

    キャンセル

  • 2016/01/03 20:40

    main.class と conponent.class(topFrame.class subFrame.class) を作成し、くっつけて動作させるようのちに改変しようと思います。 ありがとうございます!

    > package化させてプログラム単位同士でくっつけたほうが

    デフォルトパッケージを非推奨にしていますので、クラスが複数になる場合はパッケージに含めたほうが
    のような意味で使用しました、すみません;

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る