前提
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(); } }
文字数の都合から、該当のソースコードを削除させていただきました。
まず、swing は main を実行しているプロセスとは違うプロセスで動作します。
JFrame を setVisible(true) した瞬間から swing のプロセスが動き始め、以降の swing の操作は全てその swing のプロセス上で行わなければ問題が発生する可能性があります。
質問のコードでは main メソッドから Test2 のコンストラクタ内までが main のメソッドで実行されていますので、
setVisible(true) の後に add(new Order()) 等を行ってはいけません。
(その為に以前の質問の私の回答では main で細工したり setVisible を書いています。)
ウインドウシステムは時にプロセスやスレッドを理解・意識していなければならないことがあります。
ついでに、何かあちこちに setVisible が書いてありますが、コンポーネントは親が表示されれば子も表示されますので、意図的に表示状態を変ているのでなければ不要です。
みなさま
KEMONO.PANTSUはご存じの方も多いかと思いますが
ただただ自己主張を繰り返すだけの迷惑ユーザーですし
話は全く聞かないので無視しましょう。
修正依頼や具体的な指摘をしたところで自己主張で返すだけです。
それが支離滅裂だという自覚はありません。
あまつさえ、複数アカウントを所持し(規約違反)、自身の投稿にリアクションをする有様です。
普通に通報案件です。

回答2件
あなたの回答
tips
プレビュー