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

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

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

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

Q&A

解決済

2回答

1673閲覧

ボタンを押したら画面遷移させたい

ktmr

総合スコア10

Java

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

0グッド

0クリップ

投稿2022/11/16 14:19

編集2022/11/17 05:43

前提

javaのawt, swingを使用して、ログイン画面を作成しています。
ID,PASSWORDを入力後ほかの画面に遷移させたいのですが、うまくいかないという状態です。

実現したいこと

LOGINボタンを押したら画面遷移させたい

該当のソースコード

ログイン画面
イメージ説明
ログイン失敗時のエラーメッセージ
イメージ説明
ログイン完了後に遷移させたい画面
イメージ説明

試したこと

setVisible()やCardLayoutに関連があると考え、調べながらいろいろ変更を加えてみたものの解決しませんでした。

補足情報(FW/ツールのバージョンなど)

java SE 1.8

修正後

import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; import java.awt.Container; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.Insets; import java.awt.Frame; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.border.LineBorder; import javax.swing.JOptionPane; public class Test2 extends JFrame { Container main_con; JFrame main_frame; final String order_itemNames[]={"ホットドック", "サンドウィッチ", "餃子", "ラーメン", "トッポギ", "ハンバーガー"}; final int order_itemPrices[]={1300, 2600, 3500, 3800, 2500, 4700}; int order_total=0; JTextArea order_ta_list; public Test2() { this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle("ログイン画面"); this.setSize(850,500); this.setLayout(new CardLayout()); add(new Login()); add(new Order()); setVisible(true); } class Login extends JPanel { Login() { super(new BorderLayout()); //ロゴ JLabel logo = new JLabel(new ImageIcon("./res/main.png")); this.add(logo,BorderLayout.NORTH); JPanel info = new JPanel(); info.setLayout(new FlowLayout()); this.add(info,BorderLayout.SOUTH); info.add(new JLabel("ID:")); JTextField id = new JTextField("",10); info.add(id); info.add(new JLabel("PASSWORD:")); JPasswordField pw = new JPasswordField("",10); info.add(pw); JButton btn0 = new JButton("LOGIN"); info.add(btn0); btn0.addActionListener(new ActionListener(){ //LOGINボタン命令 @Override public void actionPerformed(ActionEvent e) { //ここにイベント命令 //ID,PASSWORDに入っているテキストを取り出す String idStr = new String(id.getText()); String pass = new String(pw.getPassword()); if(idStr.equals("aaa") && pass.equals("1234")) { JOptionPane.showMessageDialog(null, "Success!!", "Success", JOptionPane.INFORMATION_MESSAGE); this.next(main_frame); //この部分 }else { String selectvalues[] = {"確認"}; int value = JOptionPane.showOptionDialog(null, "IDかパスワードを間違えました", "ログイン失敗", JOptionPane.YES_NO_OPTION, JOptionPane.ERROR_MESSAGE, null, selectvalues, selectvalues[0]); id.setText(""); pw.setText(""); } } }); } } class Order extends JPanel { Order() { super(new BorderLayout()); //メニュー JPanel Order = new JPanel(); Order.setLayout(new GridLayout(2,3)); this.add(Order,BorderLayout.WEST); ImageIcon img0 = new ImageIcon("./res/0.jpg"); JButton food0 = new JButton(img0); food0.setBorderPainted(false); food0.setFocusPainted(false); food0.setContentAreaFilled(false); food0.setMargin(new Insets(3,3,5,5)); Order.add(food0); food0.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { order_ta_list.append(order_itemNames[0]+" "+order_itemPrices[0]+"円\n"); order_total = order_total + order_itemPrices[0]; } }); ImageIcon img1 = new ImageIcon("./res/1.jpg"); JButton food1 = new JButton(img1); food1.setBorderPainted(false); food1.setFocusPainted(false); food1.setContentAreaFilled(false); food1.setMargin(new Insets(3,3,5,5)); Order.add(food1); food1.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { order_ta_list.append(order_itemNames[1]+" "+order_itemPrices[1]+"円\n"); order_total = order_total + order_itemPrices[1]; } }); ImageIcon img2 = new ImageIcon("./res/2.jpg"); JButton food2 = new JButton(img2); food2.setBorderPainted(false); food2.setFocusPainted(false); food2.setContentAreaFilled(false); food2.setMargin(new Insets(3,3,5,5)); Order.add(food2); food2.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { order_ta_list.append(order_itemNames[2]+" "+order_itemPrices[2]+"円\n"); order_total = order_total + order_itemPrices[2]; } }); ImageIcon img3 = new ImageIcon("./res/3.jpg"); JButton food3 = new JButton(img3); food3.setBorderPainted(false); food3.setFocusPainted(false); food3.setContentAreaFilled(false); food3.setMargin(new Insets(3,3,5,5)); Order.add(food3); food3.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { order_ta_list.append(order_itemNames[3]+" "+order_itemPrices[3]+"円\n"); order_total = order_total + order_itemPrices[3]; } }); ImageIcon img4 = new ImageIcon("./res/4.jpg"); JButton food4 = new JButton(img4); food4.setBorderPainted(false); food4.setFocusPainted(false); food4.setContentAreaFilled(false); food4.setMargin(new Insets(3,3,5,5)); Order.add(food4); food4.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { order_ta_list.append(order_itemNames[4]+" "+order_itemPrices[4]+"円\n"); order_total = order_total + order_itemPrices[4]; } }); ImageIcon img5 = new ImageIcon("./res/5.jpg"); JButton food5 = new JButton(img5); food5.setBorderPainted(false); food5.setFocusPainted(false); food5.setContentAreaFilled(false); food5.setMargin(new Insets(3,3,5,5)); Order.add(food5); food5.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { order_ta_list.append(order_itemNames[5]+" "+order_itemPrices[5]+"円\n"); order_total = order_total + order_itemPrices[5]; } }); //注文リストとボタン JPanel list = new JPanel(); list.setLayout(new FlowLayout()); this.add(list); order_ta_list = new JTextArea("",25,13); LineBorder border = new LineBorder(Color.gray, 1, false); order_ta_list.setBorder(border); order_ta_list.setCaretPosition(0); order_ta_list.selectAll(); JScrollPane scrollpane = new JScrollPane(); scrollpane.setViewportView(order_ta_list); list.add(scrollpane); JPanel listBtn = new JPanel(); listBtn.setLayout(new FlowLayout()); list.add(listBtn); JButton btn1 = new JButton("CANCEL"); listBtn.add(btn1); btn1.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { order_ta_list.setText(""); order_total=0; } }); JButton btn2 = new JButton("ORDER"); list.add(btn2); btn2.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { order_ta_list.append("---------------\n"+order_total+"円"); } }); } } public static void main(String[] args) { new Test2(); } }

文字数の都合から、該当のソースコードを削除させていただきました。

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

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

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

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

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

jimbe

2022/11/16 17:39

まず、swing は main を実行しているプロセスとは違うプロセスで動作します。 JFrame を setVisible(true) した瞬間から swing のプロセスが動き始め、以降の swing の操作は全てその swing のプロセス上で行わなければ問題が発生する可能性があります。 質問のコードでは main メソッドから Test2 のコンストラクタ内までが main のメソッドで実行されていますので、 setVisible(true) の後に add(new Order()) 等を行ってはいけません。 (その為に以前の質問の私の回答では main で細工したり setVisible を書いています。) ウインドウシステムは時にプロセスやスレッドを理解・意識していなければならないことがあります。 ついでに、何かあちこちに setVisible が書いてありますが、コンポーネントは親が表示されれば子も表示されますので、意図的に表示状態を変ているのでなければ不要です。
m.ts10806

2022/11/16 20:42 編集

みなさま KEMONO.PANTSUはご存じの方も多いかと思いますが ただただ自己主張を繰り返すだけの迷惑ユーザーですし 話は全く聞かないので無視しましょう。 修正依頼や具体的な指摘をしたところで自己主張で返すだけです。 それが支離滅裂だという自覚はありません。 あまつさえ、複数アカウントを所持し(規約違反)、自身の投稿にリアクションをする有様です。 普通に通報案件です。
guest

回答2

0

ベストアンサー

ログイン画面とオーダー画面を行き来出来るようにするのであれば、 CardLayout で良いと思います。
「java swing CardLayout」等で検索すればサンプル等も見つかると思います。


やり方は複数ありますが、CardLayout の next ( や prev) は例えば複数シートの excel ファイルのようにページをめくるような感じで次々と切り替える場合に使用するのに使用し、本件の場合は現状 Login → Order の一方通行で、今後 Order のような画面が増えるとしても『次々と遷移していったら Login 画面に戻る』とは考え難い為、 add 時に constraint として任意の文字列を指定しておき、 CardLayout.show メソッドにその文字列を指定することで画面を切り替える方法が良いと思います。

以下は画面遷移のみに絞ったもので、 LOGIN を押すとダイアログ表示後に OrderPanel になります。

java

1import java.awt.*; 2import java.awt.event.ActionEvent; 3import java.awt.event.ActionListener; 4 5import javax.swing.*; 6 7public class OrdersFrame extends JFrame { 8 private static final String LAYOUT_LOGIN = "LoginPanel"; 9 private static final String LAYOUT_ORDER = "OrderPanel"; 10 11 public static void main(String[] args) { 12 SwingUtilities.invokeLater(new Runnable() { //フレームの生成時から swing に任せる 13 @Override 14 public void run() { 15 new OrdersFrame().setVisible(true); 16 } 17 }); 18 } 19 20 public OrdersFrame() { 21 super("Orders"); 22 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 23 setSize(850,500); 24 25 final Container container = getContentPane(); 26 final CardLayout cardLayout = new CardLayout(); 27 container.setLayout(cardLayout); 28 29 //ログイン成功時に実行する処理 30 Runnable successfulLogin = new Runnable() { 31 @Override 32 public void run() { 33 cardLayout.show(container, LAYOUT_ORDER); //表示を切り替え 34 } 35 }; 36 container.add(new LoginPanel(successfulLogin), LAYOUT_LOGIN); 37 container.add(new OrderPanel(), LAYOUT_ORDER); 38 //初期状態では最初にコンテナに add したコンポーネントだけが表示される 39 } 40 41 private static class LoginPanel extends JPanel { 42 /** 43 * ログインパネル 44 * @param successful ログイン成功時に実行する処理 45 */ 46 LoginPanel(Runnable successful) { 47 super(new BorderLayout()); 48 49 add(new JLabel("LoginPanel")); //BorderLayout で第2引数を省略すると BorderLayout.CENTER 指定扱い 50 51 JButton loginButton = new JButton("LOGIN"); 52 add(loginButton, BorderLayout.SOUTH); 53 54 loginButton.addActionListener(new ActionListener(){ 55 @Override 56 public void actionPerformed(ActionEvent e) { 57 String idStr = "aaa"; //取り出したテイ 58 String passStr = "1234"; //取り(ry 59 60 if(idStr.equals("aaa") && passStr.equals("1234")) { 61 JOptionPane.showMessageDialog(getParent(), 62 "Success!!", "Success", 63 JOptionPane.INFORMATION_MESSAGE); 64 successful.run(); 65 } else { 66 String[] options = { "確認" }; 67 JOptionPane.showOptionDialog(getParent(), 68 "IDかパスワードを間違えました", "ログイン失敗", 69 JOptionPane.OK_OPTION, JOptionPane.ERROR_MESSAGE, null, 70 options, options[0]); 71 } 72 } 73 }); 74 } 75 } 76 77 private static class OrderPanel extends JPanel { 78 OrderPanel() { 79 super(new BorderLayout()); 80 81 setBackground(Color.YELLOW); //LoginPanel と区別するため 82 add(new JLabel("OrderPanel")); 83 } 84 } 85}

投稿2022/11/16 17:47

編集2022/11/17 07:04
jimbe

総合スコア12648

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

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

ktmr

2022/11/17 02:10

jimbeさん コメントありがとうございます。 もう少し調べてみたいと思います!
ktmr

2022/11/17 04:32

next等のメゾットを使用するということがわかりました。 Login()内のbtn0のactionPerformed内に加えてみたりと、いろいろな箇所に加えて試してみたのですが一向にうまくいきませんでした。 プログラムの構造からおかしいのでしょうか?
jimbe

2022/11/17 05:23 編集

>Login()内のbtn0のactionPerformed内に加えてみたりと、いろいろな箇所に加えて試してみた そもそもプログラムはそのように運で動作するかしないかで作るものではありません。 プログラムはコンピュータへの指令書なのですから、何が起きたら何を用いて何をするのかを全て的確に書かなければならず、当然書く側が明確に分かっていなければ書けません。 (文字通り)石頭な部下に何かの作業手順を伝えるなら、『Aの棚のBの引き出しからCを1つ取ってDの箱に入れてEさんに渡し、Eさんが返してくれた箱にFがあったら・・・』と全て書かないと出来ないと考えてください。 また「うまくいきません」では、何が起きているのか私には分かりません。構造がおかしいのかは、構造を見なければ分かりません。コードを修正されたのでしたら、質問を編集・追加して頂けますか。 CardLayout の使い方を調べられた過程で、サンプルは無かったでしょうか。 有りましたら、まずはそのサンプルを実行して動作を見て、その動作がどのようなコードによって成されているのかを理解されるのがまず先かと思います。
ktmr

2022/11/17 05:45

失礼いたしました。 Login()とOrder()のパネルはどちらともthisにaddされているので、this.next(main_frame);としたところうまくいかないという状態です。
jimbe

2022/11/17 07:18 編集

>this.next(main_frame); next メソッドは CardLayout のものですが、その this は CardLayout でしょうか? JFrame のコンストラクタ内では this は JFrame を指しますが、 Login クラスで書けば this は Login クラスを指しますし、さらに内部の無名クラス(オブジェクト)内ではその無名クラス(オブジェクト)を指します。 該当箇所での this は btn0.addActionListener(new ActionListener(){ //LOGINボタン命令 の new ActionListener() のことを指し、お考えとは違うことになっています。 また、 CardLayout の next メソッドのパラメータは、 CardLayout が設定されているコンポーネントである必要があります。 JFrame の setLayout メソッドや add メソッドの対象は JFrame では無く JFrame 内の ContentPane です。 (昔は getContentPane().setLayout とか getContentPane().add とかのように書かなければならなかったですが、面倒だからか、 getContentPane() を書かなくて済むようになりました。が、対象が ContentPane なのは変わりません。) JFrame 自体と JFrame 内の ContentPane は別モノですので、 next に指定するのは main_frame.getContentPane() となるのでは無いでしょうか。 ついでに言うと、 main_frame 変数に値が設定されていません。 さらについでに、 static で無い内部クラスでは、そのクラスを含む外側のクラスオブジェクトを『外側のクラス名.this』という形で参照できますので、別途変数は必要ありません。
ktmr

2022/11/17 07:48

ありがとうございました。非常に参考になりました。 プログラムの構成からもう一度考え直し、jimbeさんのコードを参考にしつつ、うまく動作させることができました。
guest

0

Text

1ある劣悪なハッシュ関数は同じ入力に対して異なるハッシュ値を返すことがある。

投稿2022/11/16 15:34

atcoderyellow

総合スコア481

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

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

jimbe

2022/11/16 17:50

>ある劣悪なハッシュ関数は同じ入力に対して異なる 全く的外れです。
atcoderyellow

2022/11/16 18:22

ハッシュ関数は参照透過性を失いやすい性質を持つ。 すると、同じ入力に対して異なるハッシュ値を返すことがある。
jimbe

2022/11/16 18:26

言葉が足りませんでした。 「質問にはハッシュ関数もハッシュ値も関係ありませんので、回答として全く的外れです。」
atcoderyellow

2022/11/16 18:31

パスワードはデータベースに保存される。
jimbe

2022/11/17 04:17

質問の本文にもコードにも「データベース」は出てきていません。 画面遷移の質問であってユーザ情報をどう保持するかは関係無いので、ログインの処理を固定値で行っているのは妥当と思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問