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

回答編集履歴

5

画像追加

2018/08/18 09:42

投稿

opyon
opyon

スコア1009

answer CHANGED
@@ -25,7 +25,7 @@
25
25
  各ボタンをOnOfし青と赤の円を描画し両方offで表示無し
26
26
  青と赤両方Onなら赤だけ表示
27
27
 
28
- ![イメージ説明](4301a6cfc4384b980fa084e00979b72b.png)
28
+ ![イメージ説明](e3f8a20ab807a8887d096257c0b74634.png)
29
29
 
30
30
  ```JAVA
31
31
  package sample;

4

間違いの修正

2018/08/18 09:42

投稿

opyon
opyon

スコア1009

answer CHANGED
@@ -1,14 +1,16 @@
1
- ※動作確認調査中※
2
- 図形描画されなくなっています
3
- ---
4
-
5
1
  ボタンを押す毎に再描画することが出来たので参考になればと思います。
6
2
  大まかな動きの流れなどの確認は出来るはずです。
7
3
 
4
+ 追記:
5
+ [@umyu](https://teratail.com/users/umyu#reply)さんのご協力ご指導の元無事完成しました。
6
+ GUI初実装でしたのでとても勉強になりました。ありがとうございました。
7
+
8
8
  ポイントは
9
9
  ・**ActionListener**インターフェースを使ってボタンがクリックされた場合のイベントを利用する
10
10
  ・ボタンがクリックされた状態をフラグを使って**ボタン制御**OnOffする
11
+ ・paint()は使わずに**paintComponent()を@Override**して利用する
12
+
11
- ・**paint()メソッド**内で**ボタン制御**OnOffを判定し再描画させたいものを制御する
13
+ 描画用パネルgraphなどを作り**paintComponent()**内で**ボタン制御**OnOffを判定し再描画させたいものを制御する
12
14
  ・再描画はrepaint()で行う
13
15
 
14
16
  [ActionListenerインターフェース](https://www.javadrive.jp/tutorial/event/index2.html)
@@ -26,10 +28,10 @@
26
28
  ![イメージ説明](4301a6cfc4384b980fa084e00979b72b.png)
27
29
 
28
30
  ```JAVA
31
+ package sample;
29
32
 
30
33
  import java.awt.BorderLayout;
31
34
  import java.awt.Color;
32
- import java.awt.Dimension;
33
35
  import java.awt.Graphics;
34
36
  import java.awt.Graphics2D;
35
37
  import java.awt.event.ActionEvent;
@@ -40,6 +42,7 @@
40
42
  import javax.swing.JFrame;
41
43
  import javax.swing.JLabel;
42
44
  import javax.swing.JPanel;
45
+ import javax.swing.border.LineBorder;
43
46
 
44
47
  public class SampleSwing extends JFrame implements ActionListener {
45
48
 
@@ -76,6 +79,38 @@
76
79
  btn2.addActionListener(this);
77
80
  btn2.setActionCommand("Button 2");
78
81
 
82
+ //paintComponent()は自動で呼び出されるので
83
+ //別途ボタン制御OnOffのフラグを判定し
84
+ //描画させたいものを制御する
85
+
86
+ //paint()は使わずに
87
+ //paintComponent()を@Overrideして利用する
88
+
89
+ JPanel graph = new JPanel() {
90
+ @Override
91
+ public void paintComponent(Graphics g) {
92
+
93
+ super.paintComponent(g);
94
+
95
+ if (!paintFlag1 && !paintFlag2) {
96
+ return;
97
+ }
98
+
99
+ Graphics2D g2 = (Graphics2D) g;
100
+ if (paintFlag1) {
101
+ g2.setColor(Color.BLUE);
102
+ }
103
+ if (paintFlag2) {
104
+ g2.setColor(Color.RED);
105
+ }
106
+ Ellipse2D ellipse = new Ellipse2D.Double(0, 70, 150, 150);
107
+ g2.draw(ellipse);
108
+ }
109
+ };
110
+
111
+ // JPanelのボーダー色を設定(可視化用)
112
+ graph.setBorder(new LineBorder(Color.CYAN));
113
+
79
114
  JPanel p = new JPanel();
80
115
 
81
116
  p.setLayout(new BorderLayout());
@@ -84,65 +119,34 @@
84
119
  p.add(btn1, BorderLayout.NORTH);
85
120
  p.add(btn2, BorderLayout.SOUTH);
86
121
 
122
+ //図形描画
123
+ p.add(graph, BorderLayout.CENTER);
124
+
87
125
  p.add(label1, BorderLayout.WEST);
88
126
  p.add(label2, BorderLayout.EAST);
89
127
  }
90
128
 
91
129
  //ボタン制御OnOff
130
+ @Override
92
131
  public void actionPerformed(ActionEvent e) {
93
132
  String cmd = e.getActionCommand();
94
133
  if (cmd.equals("Button 1")) {
95
134
  paintFlag1 = !paintFlag1;
96
135
  if (paintFlag1) {
136
+ label1.setText("ボタン1:青ON");
137
+ } else {
97
138
  label1.setText("ボタン1:青OFF");
98
- } else {
99
- label1.setText("ボタン1:青ON");
100
139
  }
101
140
  } else if (cmd.equals("Button 2")) {
102
141
  paintFlag2 = !paintFlag2;
103
142
  if (paintFlag2) {
143
+ label2.setText("ボタン2:赤ON");
144
+ } else {
104
145
  label2.setText("ボタン2:赤OFF");
105
- } else {
106
- label2.setText("ボタン2:赤ON");
107
146
  }
108
147
  }
109
-
110
- //paint()は自動で呼び出されるので
111
- //別途ボタン制御OnOffのフラグを判定し
112
- //描画させたいものを制御する
113
-
114
- JPanel graph = new JPanel() {
115
- @Override
116
- public void paintComponent(Graphics g) {
117
-
118
- super.paintComponent(g);
119
-
120
- if (!paintFlag1 && !paintFlag2) {
121
- super.paintComponent(g);
122
- return;
123
- }
124
-
125
- Graphics2D g2 = (Graphics2D) g;
126
- if (paintFlag1) {
127
- g2.setColor(Color.BLUE);
128
- }
129
- if (paintFlag2) {
130
- g2.setColor(Color.RED);
131
- }
132
- Ellipse2D ellipse = new Ellipse2D.Double(100, 100, 200, 200);
133
- g2.draw(ellipse);
134
-
135
- super.paintComponent(g);
136
-
137
- }
138
- };
139
-
140
- graph.setPreferredSize(new Dimension(300, 300));
141
- getContentPane().add(graph);
142
-
143
- //これでいいのか疑問?
148
+ //再描画
144
149
  repaint();
145
150
  }
146
-
147
151
  }
148
152
  ```

3

間違いの修正

2018/08/18 09:35

投稿

opyon
opyon

スコア1009

answer CHANGED
@@ -1,3 +1,7 @@
1
+ ※動作確認調査中※
2
+ 図形描画されなくなっています
3
+ ---
4
+
1
5
  ボタンを押す毎に再描画することが出来たので参考になればと思います。
2
6
  大まかな動きの流れなどの確認は出来るはずです。
3
7
 
@@ -22,8 +26,10 @@
22
26
  ![イメージ説明](4301a6cfc4384b980fa084e00979b72b.png)
23
27
 
24
28
  ```JAVA
29
+
25
30
  import java.awt.BorderLayout;
26
31
  import java.awt.Color;
32
+ import java.awt.Dimension;
27
33
  import java.awt.Graphics;
28
34
  import java.awt.Graphics2D;
29
35
  import java.awt.event.ActionEvent;
@@ -36,7 +42,7 @@
36
42
  import javax.swing.JPanel;
37
43
 
38
44
  public class SampleSwing extends JFrame implements ActionListener {
39
-
45
+
40
46
  private JPanel buttonPanel;
41
47
  private JLabel label1;
42
48
  private JLabel label2;
@@ -45,7 +51,7 @@
45
51
  private boolean paintFlag2 = false;
46
52
 
47
53
  public static void main(String[] args) {
48
- SampleSwing test = new SampleSwing("SwingTest");
54
+ SampleSwing test = new SampleSwing("SampleSwing");
49
55
 
50
56
  test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
51
57
  test.setVisible(true);
@@ -57,9 +63,9 @@
57
63
 
58
64
  setSize(400, 400);
59
65
 
60
- label1 = new JLabel("");
66
+ label1 = new JLabel("ボタン1:青OFF");
61
67
  label1.setHorizontalAlignment(JLabel.LEFT);
62
- label2 = new JLabel("");
68
+ label2 = new JLabel("ボタン2:赤OFF");
63
69
  label2.setHorizontalAlignment(JLabel.RIGHT);
64
70
 
65
71
  JButton btn1 = new JButton("Button 1");
@@ -71,55 +77,72 @@
71
77
  btn2.setActionCommand("Button 2");
72
78
 
73
79
  JPanel p = new JPanel();
74
- p.add(btn1);
75
- p.add(btn2);
76
80
 
81
+ p.setLayout(new BorderLayout());
77
82
  getContentPane().add(p, BorderLayout.CENTER);
83
+
84
+ p.add(btn1, BorderLayout.NORTH);
85
+ p.add(btn2, BorderLayout.SOUTH);
86
+
78
- getContentPane().add(label1, BorderLayout.PAGE_START);
87
+ p.add(label1, BorderLayout.WEST);
79
- getContentPane().add(label2, BorderLayout.PAGE_END);
88
+ p.add(label2, BorderLayout.EAST);
80
89
  }
81
90
 
82
91
  //ボタン制御OnOff
83
92
  public void actionPerformed(ActionEvent e) {
84
93
  String cmd = e.getActionCommand();
85
94
  if (cmd.equals("Button 1")) {
95
+ paintFlag1 = !paintFlag1;
86
96
  if (paintFlag1) {
87
- paintFlag1 = false;
88
97
  label1.setText("ボタン1:青OFF");
89
98
  } else {
90
- paintFlag1 = true;
91
99
  label1.setText("ボタン1:青ON");
92
100
  }
93
101
  } else if (cmd.equals("Button 2")) {
102
+ paintFlag2 = !paintFlag2;
94
103
  if (paintFlag2) {
95
104
  label2.setText("ボタン2:赤OFF");
96
- paintFlag2 = false;
97
105
  } else {
98
- paintFlag2 = true;
99
106
  label2.setText("ボタン2:赤ON");
100
107
  }
101
108
  }
109
+
110
+ //paint()は自動で呼び出されるので
111
+ //別途ボタン制御OnOffのフラグを判定し
112
+ //描画させたいものを制御する
113
+
114
+ JPanel graph = new JPanel() {
115
+ @Override
116
+ public void paintComponent(Graphics g) {
117
+
118
+ super.paintComponent(g);
119
+
120
+ if (!paintFlag1 && !paintFlag2) {
121
+ super.paintComponent(g);
122
+ return;
123
+ }
124
+
125
+ Graphics2D g2 = (Graphics2D) g;
126
+ if (paintFlag1) {
127
+ g2.setColor(Color.BLUE);
128
+ }
129
+ if (paintFlag2) {
130
+ g2.setColor(Color.RED);
131
+ }
132
+ Ellipse2D ellipse = new Ellipse2D.Double(100, 100, 200, 200);
133
+ g2.draw(ellipse);
134
+
135
+ super.paintComponent(g);
136
+
137
+ }
138
+ };
139
+
140
+ graph.setPreferredSize(new Dimension(300, 300));
141
+ getContentPane().add(graph);
142
+
143
+ //これでいいのか疑問?
102
144
  repaint();
103
145
  }
104
-
105
- //paint()は自動で呼び出されるので
146
+
106
- //別途ボタン制御OnOffのフラグを判定し
107
- //描画させたいものを制御する
108
- public void paint(Graphics g) {
109
- if (!paintFlag1 && !paintFlag2) {
110
- super.paint(g);
111
- return;
112
- }
113
- super.paint(g);
114
- Graphics2D g2 = (Graphics2D) g;
115
- if (paintFlag1) {
116
- g2.setColor(Color.BLUE);
117
- }
118
- if (paintFlag2) {
119
- g2.setColor(Color.RED);
120
- }
121
- Ellipse2D ellipse = new Ellipse2D.Double(100, 100, 200, 200);
122
- g2.draw(ellipse);
123
- }
124
147
  }
125
148
  ```

2

画像追加

2018/08/18 08:32

投稿

opyon
opyon

スコア1009

answer CHANGED
@@ -19,7 +19,7 @@
19
19
  各ボタンをOnOfし青と赤の円を描画し両方offで表示無し
20
20
  青と赤両方Onなら赤だけ表示
21
21
 
22
- ![イメージ説明](abdee2ee4eb7674deebf981cfdf44ecb.png)
22
+ ![イメージ説明](4301a6cfc4384b980fa084e00979b72b.png)
23
23
 
24
24
  ```JAVA
25
25
  import java.awt.BorderLayout;

1

画像追加

2018/08/17 16:26

投稿

opyon
opyon

スコア1009

answer CHANGED
@@ -19,6 +19,8 @@
19
19
  各ボタンをOnOfし青と赤の円を描画し両方offで表示無し
20
20
  青と赤両方Onなら赤だけ表示
21
21
 
22
+ ![イメージ説明](abdee2ee4eb7674deebf981cfdf44ecb.png)
23
+
22
24
  ```JAVA
23
25
  import java.awt.BorderLayout;
24
26
  import java.awt.Color;