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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

3023閲覧

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

Puhu

総合スコア31

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/11/13 12:00

現在、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); }

}

}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

lang

1Container contentPane = getContentPane();

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

lang

1frames.add(p);

でもできます。

投稿2015/11/13 12:48

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Puhu

2015/11/13 13:17

解決しました! 本当にありがとうございましたー!
Puhu

2016/01/03 08:43

この質問なのですが、これを利用して import java.io.File; import java.io.IOException; import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.JFrame; import javax.swing.JPanel; 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.ImageIcon; import java.applet.*; import java.awt.event.KeyListener; import java.awt.event.KeyEvent; import java.awt.Color; public class top extends JFrame implements ActionListener,KeyListener{ static top frame = new top("* 。violin mania。 *"); static JFrame frames = new JFrame("* 。 music select。 *");//曲選択 public static void main(String args[]){ frame.setVisible(true); } top(String title){ setTitle(title); setBounds(600,10,600,1000); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); p.setLayout(null); ImageIcon top_bg = new ImageIcon("top.png"); JLabel bg1 = new JLabel(top_bg); bg1.setBounds(0,0,600,1000); ImageIcon icon2 = new ImageIcon("option.png"); JButton fileButton = new JButton(icon2); fileButton.setBounds(370,750,200,50); fileButton.addActionListener(this); ImageIcon icon1 = new ImageIcon("start.png"); JButton button = new JButton(icon1); button.setBounds(370,600,200,50); button.addActionListener(this); button.setActionCommand("start"); p.add(bg1); p.add(button); p.add(fileButton); //どこにフォーカスされてるかわからない為すべてにKeyListenerを登録 addKeyListener(this); bg1.addKeyListener(this); fileButton.addKeyListener(this); button.addKeyListener(this); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); } public void actionPerformed(ActionEvent e){ String cmd = e.getActionCommand(); if (cmd.equals("start")){ frame.setVisible(false); frames.setBounds(600,10,600,1000); frames.getContentPane().setBackground(Color.black); frames.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p_select = new JPanel(); p_select.setLayout(null); ImageIcon oneshall1 = new ImageIcon("/music/onedari_shall_we/oneshall_out.png"); ImageIcon oneshall2 = new ImageIcon("/music/onedari_shall_we/oneshall_over.png"); JButton music1 = new JButton(oneshall1); music1.setBounds(100,50,410,116); music1.setRolloverIcon(oneshall2); music1.addActionListener(this); p_select.add(music1); Container contentPane2 = getContentPane(); contentPane2.add(p_select, BorderLayout.CENTER); frames.setVisible(true); } } public void keyPressed(KeyEvent e){ } public void keyReleased(KeyEvent e){ } public void keyTyped(KeyEvent e){ char key = e.getKeyChar(); if(key == '1'){ AudioClip audio; audio = Applet.newAudioClip(getClass().getResource("pinpon.wav")); audio.play(); }else if(key == '2'){ AudioClip audio; audio = Applet.newAudioClip(getClass().getResource("boo.wav")); audio.play(); } } } としたところ、画面を移動した後、画像の表示が上手くされないということが起きました。 移動後の画面の色をblackに設定していたのですが、それもwhiteになっています。 画面の色で frames.getContentPane().setBackground(Color.black); このようにしている場合は frames.add(p_select) のようなやりかたは使えないのでしょうか?
argius

2016/01/03 09:40

Container contentPane2 = getContentPane(); のところで、同じミスをしていますね。 Container contentPane2 = frames.getContentPane(); こうすればOKです。 framesもtopのようにクラスにして、変数名もtopFrame,nextFrameなどのようにしたほうが間違いが無くなると思います。(EclipseなどのIDEを使うと変数の名前を変えるのが簡単にできます。) 今の状態では、actionPerformedの中でframesの初期設定と状態遷移がごっちゃになっているので、間違いが起こりやすいように見えます。 コンポーネントのレイアウトは、そのクラスのコンストラクターで行うようにして、 actionPerformedの中では、状態遷移だけを行うようにしたほうが良いですよ。 もうひとつの問題は、p_selectが不透明なことです。 JPanelは、デフォルトでは不透明なので、 p_select.setOpaque(false); として透明にしないと、背景が見えなくなってしまいます。 (厳密には、コンポーネントのデフォルト色はwhiteではなく薄いグレーです。)
Puhu

2016/01/03 10:52

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

2016/01/03 11:21

> package化させてプログラム単位同士でくっつけたほうが すみません、これがどういう状態を指しているのかよく分からないです。 Javaはかなり前にデフォルトパッケージを非推奨にしていますので、クラスが複数になる場合はパッケージに含めたほうが良いです。 練習の場合はなくても良いですけどね。何か公開するものを作るのでしたら、パッケージに入れたほうが無難です。 あと、レイアウトや設定はコンポーネントのコンストラクターにまとめて、状態遷移はコンポーネントとは別のクラスで行う(そこにtop frameとかJFrame framesをまとめる)のが良いかも知れません。
Puhu

2016/01/03 11:40

main.class と conponent.class(topFrame.class subFrame.class) を作成し、くっつけて動作させるようのちに改変しようと思います。 ありがとうございます! > package化させてプログラム単位同士でくっつけたほうが は デフォルトパッケージを非推奨にしていますので、クラスが複数になる場合はパッケージに含めたほうが のような意味で使用しました、すみません;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問