回答編集履歴

2

内部クラス static 化

2022/11/17 07:04

投稿

jimbe
jimbe

スコア12646

test CHANGED
@@ -47,7 +47,7 @@
47
47
  //初期状態では最初にコンテナに add したコンポーネントだけが表示される
48
48
  }
49
49
 
50
- private class LoginPanel extends JPanel {
50
+ private static class LoginPanel extends JPanel {
51
51
  /**
52
52
  * ログインパネル
53
53
  * @param successful ログイン成功時に実行する処理
@@ -67,13 +67,13 @@
67
67
  String passStr = "1234"; //取り(ry
68
68
 
69
69
  if(idStr.equals("aaa") && passStr.equals("1234")) {
70
- JOptionPane.showMessageDialog(OrdersFrame.this,
70
+ JOptionPane.showMessageDialog(getParent(),
71
71
  "Success!!", "Success",
72
72
  JOptionPane.INFORMATION_MESSAGE);
73
73
  successful.run();
74
74
  } else {
75
75
  String[] options = { "確認" };
76
- JOptionPane.showOptionDialog(OrdersFrame.this,
76
+ JOptionPane.showOptionDialog(getParent(),
77
77
  "IDかパスワードを間違えました", "ログイン失敗",
78
78
  JOptionPane.OK_OPTION, JOptionPane.ERROR_MESSAGE, null,
79
79
  options, options[0]);
@@ -83,7 +83,7 @@
83
83
  }
84
84
  }
85
85
 
86
- private class OrderPanel extends JPanel {
86
+ private static class OrderPanel extends JPanel {
87
87
  OrderPanel() {
88
88
  super(new BorderLayout());
89
89
 

1

コード追加

2022/11/17 06:30

投稿

jimbe
jimbe

スコア12646

test CHANGED
@@ -1,2 +1,95 @@
1
1
  ログイン画面とオーダー画面を行き来出来るようにするのであれば、 CardLayout で良いと思います。
2
2
  「java swing CardLayout」等で検索すればサンプル等も見つかると思います。
3
+
4
+ ---
5
+ やり方は複数ありますが、CardLayout の next ( や prev) は例えば複数シートの excel ファイルのようにページをめくるような感じで次々と切り替える場合に使用するのに使用し、本件の場合は現状 Login → Order の一方通行で、今後 Order のような画面が増えるとしても『次々と遷移していったら Login 画面に戻る』とは考え難い為、 add 時に constraint として任意の文字列を指定しておき、 CardLayout.show メソッドにその文字列を指定することで画面を切り替える方法が良いと思います。
6
+
7
+ 以下は画面遷移のみに絞ったもので、 LOGIN を押すとダイアログ表示後に OrderPanel になります。
8
+
9
+ ```java
10
+ import java.awt.*;
11
+ import java.awt.event.ActionEvent;
12
+ import java.awt.event.ActionListener;
13
+
14
+ import javax.swing.*;
15
+
16
+ public class OrdersFrame extends JFrame {
17
+ private static final String LAYOUT_LOGIN = "LoginPanel";
18
+ private static final String LAYOUT_ORDER = "OrderPanel";
19
+
20
+ public static void main(String[] args) {
21
+ SwingUtilities.invokeLater(new Runnable() { //フレームの生成時から swing に任せる
22
+ @Override
23
+ public void run() {
24
+ new OrdersFrame().setVisible(true);
25
+ }
26
+ });
27
+ }
28
+
29
+ public OrdersFrame() {
30
+ super("Orders");
31
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
32
+ setSize(850,500);
33
+
34
+ final Container container = getContentPane();
35
+ final CardLayout cardLayout = new CardLayout();
36
+ container.setLayout(cardLayout);
37
+
38
+ //ログイン成功時に実行する処理
39
+ Runnable successfulLogin = new Runnable() {
40
+ @Override
41
+ public void run() {
42
+ cardLayout.show(container, LAYOUT_ORDER); //表示を切り替え
43
+ }
44
+ };
45
+ container.add(new LoginPanel(successfulLogin), LAYOUT_LOGIN);
46
+ container.add(new OrderPanel(), LAYOUT_ORDER);
47
+ //初期状態では最初にコンテナに add したコンポーネントだけが表示される
48
+ }
49
+
50
+ private class LoginPanel extends JPanel {
51
+ /**
52
+ * ログインパネル
53
+ * @param successful ログイン成功時に実行する処理
54
+ */
55
+ LoginPanel(Runnable successful) {
56
+ super(new BorderLayout());
57
+
58
+ add(new JLabel("LoginPanel")); //BorderLayout で第2引数を省略すると BorderLayout.CENTER 指定扱い
59
+
60
+ JButton loginButton = new JButton("LOGIN");
61
+ add(loginButton, BorderLayout.SOUTH);
62
+
63
+ loginButton.addActionListener(new ActionListener(){
64
+ @Override
65
+ public void actionPerformed(ActionEvent e) {
66
+ String idStr = "aaa"; //取り出したテイ
67
+ String passStr = "1234"; //取り(ry
68
+
69
+ if(idStr.equals("aaa") && passStr.equals("1234")) {
70
+ JOptionPane.showMessageDialog(OrdersFrame.this,
71
+ "Success!!", "Success",
72
+ JOptionPane.INFORMATION_MESSAGE);
73
+ successful.run();
74
+ } else {
75
+ String[] options = { "確認" };
76
+ JOptionPane.showOptionDialog(OrdersFrame.this,
77
+ "IDかパスワードを間違えました", "ログイン失敗",
78
+ JOptionPane.OK_OPTION, JOptionPane.ERROR_MESSAGE, null,
79
+ options, options[0]);
80
+ }
81
+ }
82
+ });
83
+ }
84
+ }
85
+
86
+ private class OrderPanel extends JPanel {
87
+ OrderPanel() {
88
+ super(new BorderLayout());
89
+
90
+ setBackground(Color.YELLOW); //LoginPanel と区別するため
91
+ add(new JLabel("OrderPanel"));
92
+ }
93
+ }
94
+ }
95
+ ```