teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

コード追記

2020/04/19 13:40

投稿

jimbe
jimbe

スコア13357

answer CHANGED
@@ -1,3 +1,124 @@
1
1
  > current_show
2
2
 
3
- 該当するラベルは center_show では?
3
+ 該当するラベルは center_show では?
4
+
5
+ #追記
6
+ 久しぶりに swing を弄ってみました.
7
+ CD ボタンを押した時の処理は, 無名クラスで設定しています.
8
+ 各ボタンの大きさはイベントを受けて修正するようにしています. (SizeUnifier クラス)
9
+ 各コンポーネントの配置は座標指定では無く Layout に任せるようにしていますので, ウインドウの大きさを変えると中央のパネルだけが拡縮します.
10
+ ```java
11
+ package teratail.q254786;
12
+
13
+ import java.awt.*;
14
+ import java.awt.event.*;
15
+ import javax.swing.*;
16
+
17
+ public class ExGUISwing_03 extends JFrame {
18
+ protected JButton[] buttons = new JButton[6];
19
+ protected JLabel center_show;
20
+
21
+ ExGUISwing_03(){
22
+ super.setTitle("ExGUISwing_03");
23
+ setDefaultCloseOperation(EXIT_ON_CLOSE); //画面を閉じた時に実行を停止する
24
+ setSize(360, 150);
25
+
26
+ //テスト用?ラベル
27
+ center_show = new JLabel("Power Off");
28
+ center_show.setFont(new Font("Arial" , Font.BOLD, 19));
29
+ center_show.setForeground(new Color(1,125,0));
30
+ center_show.setSize(100,100);
31
+
32
+ //ボタン群
33
+ buttons[0] = new JButton("PW");
34
+ buttons[1] = new JButton("AM");
35
+ buttons[2] = new JButton("FM");
36
+ buttons[3] = new JButton("CD");
37
+ buttons[3].addActionListener(new ActionListener() {
38
+ @Override
39
+ public void actionPerformed(ActionEvent e) {
40
+ center_show.setText("aaa"); // CDのボタンを押した時にパネルの表示を変える。
41
+ }
42
+ });
43
+ buttons[4] = new JButton("Up");
44
+ buttons[5] = new JButton("Down");
45
+
46
+ new SizeUnifier(buttons); //各ボタンの大きさを統一
47
+
48
+ //画面編成
49
+ Container contentPane = this.getContentPane();
50
+ contentPane.add(createCenterPanel(), BorderLayout.CENTER); //真ん中パネル
51
+ contentPane.add(createButtonPanel(0, 2), BorderLayout.WEST); //左ボタン群
52
+ contentPane.add(createButtonPanel(3, 5), BorderLayout.EAST); //右ボタン群
53
+ }
54
+ /**
55
+ * 中央パネルを生成する
56
+ */
57
+ private JPanel createCenterPanel() {
58
+ JPanel panel = new JPanel();
59
+ panel.setSize(160,120);
60
+ panel.setBorder(BorderFactory.createCompoundBorder(
61
+ BorderFactory.createEmptyBorder(5, 0, 5, 0), //top,left,botton,right
62
+ BorderFactory.createLoweredBevelBorder()
63
+ ));
64
+ panel.add(center_show);
65
+ return panel;
66
+ }
67
+ /**
68
+ * button[i](i=is~ie) のボタンを配置したパネルを生成する
69
+ */
70
+ private JPanel createButtonPanel(int is, int ie) {
71
+ JPanel panel = new JPanel(null);
72
+ panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
73
+ panel.setSize(100, 150);
74
+ panel.setPreferredSize(panel.getSize());
75
+ for(int i=is; i<=ie; i++) {
76
+ panel.add(Box.createVerticalStrut(5));
77
+ buttons[i].setAlignmentX(JComponent.CENTER_ALIGNMENT);
78
+ panel.add(buttons[i]);
79
+ panel.add(Box.createVerticalStrut(5));
80
+ }
81
+ return panel;
82
+ }
83
+
84
+ /**
85
+ * コンストラクタで指定されたコンポーネントの大きさを, 一番大きいものに統一する
86
+ */
87
+ private class SizeUnifier implements ComponentListener {
88
+ private JComponent components[];
89
+ SizeUnifier(JComponent... components) {
90
+ this.components = components;
91
+ for(JComponent c : components) c.addComponentListener(this);
92
+ }
93
+ @Override
94
+ public void componentResized(ComponentEvent e) {
95
+ int w = 0, h = 0;
96
+ for(JComponent c : components) {
97
+ Dimension size = c.getSize();
98
+ if(w < size.width) w = size.width;
99
+ if(h < size.height) h = size.height;
100
+ }
101
+ for(JComponent c : components) {
102
+ Dimension size = c.getSize();
103
+ if(w != size.width || h != size.height) {
104
+ c.setSize(w,h);
105
+ c.setMaximumSize(c.getSize());
106
+ c.revalidate();
107
+ }
108
+ }
109
+ }
110
+ @Override
111
+ public void componentMoved(ComponentEvent e) {}
112
+ @Override
113
+ public void componentShown(ComponentEvent e) {}
114
+ @Override
115
+ public void componentHidden(ComponentEvent e) {}
116
+ }
117
+
118
+ public static void main(String[] args) {
119
+ ExGUISwing_03 ini = new ExGUISwing_03();
120
+ ini.setVisible(true);
121
+ }
122
+ }
123
+ ```
124
+ ![実行イメージ](53bf8a19189598f3026092b0666f4391.png)