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

回答編集履歴

2

コードのゴミを削除

2021/09/22 07:26

投稿

jimbe
jimbe

スコア13357

answer CHANGED
@@ -94,7 +94,7 @@
94
94
  void changed(int index, int value);
95
95
  }
96
96
 
97
- private JLabel messageLabel = new JLabel("数値を入力してください");;
97
+ private JLabel messageLabel = new JLabel("数値を入力してください");
98
98
  private ChangeListener listener;
99
99
 
100
100
  DataPanel(int size, ChangeListener listener) {

1

コード追加

2021/09/22 07:26

投稿

jimbe
jimbe

スコア13357

answer CHANGED
@@ -4,4 +4,177 @@
4
4
  少なくとも Swing ではキー入力するために Scanner は使えません。
5
5
 
6
6
  java でウインドウを使ってどうこうするモノを作ることは、 System.out.println や Scanner を使ったコマンド型のプログラムよりも難易度が格段に違います。
7
- 大変失礼ですが、このエラーで戸惑われているようでは『まだ早いのでは』と思わざるを得ません。
7
+ 大変失礼ですが、このエラーで戸惑われているようでは『まだ早いのでは』と思わざるを得ません。
8
+
9
+ ----
10
+
11
+ GUI で完結するように作ってみました。
12
+
13
+ LineGraph.java
14
+ ```java
15
+ package teratail_java.q360628;
16
+
17
+ import java.awt.*;
18
+ import java.awt.event.*;
19
+
20
+ import javax.swing.*;
21
+ import javax.swing.event.DocumentEvent;
22
+ import javax.swing.event.DocumentListener;
23
+
24
+ public class LineGraph extends JFrame {
25
+
26
+ public static void main(String args[]) {
27
+ new LineGraph().setVisible(true);
28
+ }
29
+
30
+ private static final int DATASIZE = 6;
31
+
32
+ LineGraph() {
33
+ super("LineGraph");
34
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
35
+
36
+ LineGraphPanel graphPanel = new LineGraphPanel(DATASIZE);
37
+ DataPanel dataPanel = new DataPanel(DATASIZE, new DataPanel.ChangeListener() {
38
+ @Override
39
+ public void changed(int index, int value) {
40
+ graphPanel.setData(index, value);
41
+ }
42
+ });
43
+
44
+ add(graphPanel, BorderLayout.CENTER);
45
+ add(dataPanel, BorderLayout.NORTH);
46
+ pack();
47
+ }
48
+
49
+ private static class LineGraphPanel extends JPanel {
50
+ private int data[];
51
+
52
+ LineGraphPanel(int datasize) {
53
+ setPreferredSize(new Dimension(300, 300));
54
+ setMinimumSize(getPreferredSize());
55
+
56
+ data = new int[datasize];
57
+ }
58
+
59
+ void setData(int index, int value) {
60
+ data[index] = value;
61
+ repaint();
62
+ }
63
+
64
+ public void paint(Graphics g) {
65
+ super.paint(g);
66
+
67
+ //Xスケール
68
+ g.drawLine( 50, 250, 250, 250);
69
+ for (int i=0; i<data.length; i++) {
70
+ String s = String.format("%3d", i);
71
+ g.drawString(s, i * 20 + 40, 270);
72
+ }
73
+
74
+ //Yスケール
75
+ g.drawLine( 50, 40, 50, 250);
76
+ for (int i=0; i<=10; i++) {
77
+ String s = String.format("%3d", i * 10);
78
+ g.drawString(s, 28, 250 - i * 20);
79
+ }
80
+
81
+ //グラフ
82
+ for (int i=0; i<data.length-1; i++) {
83
+ int x1 = i * 20 + 50;
84
+ int x2 = (i + 1) * 20 + 50;
85
+ int y1 = 250 - data[i] * 2;
86
+ int y2 = 250 - data[i+1] * 2;
87
+ g.drawLine( x1, y1, x2, y2);
88
+ }
89
+ }
90
+ }
91
+
92
+ private static class DataPanel extends JPanel {
93
+ interface ChangeListener {
94
+ void changed(int index, int value);
95
+ }
96
+
97
+ private JLabel messageLabel = new JLabel("数値を入力してください");;
98
+ private ChangeListener listener;
99
+
100
+ DataPanel(int size, ChangeListener listener) {
101
+ super(new BorderLayout());
102
+ this.listener = listener;
103
+
104
+ add(messageLabel, BorderLayout.NORTH);
105
+
106
+ JPanel inputPanel = new JPanel(new FlowLayout());
107
+ for(int i=0; i<size; i++) {
108
+ inputPanel.add(new LabelAndInputField(i, 0));
109
+ }
110
+ add(inputPanel, BorderLayout.CENTER);
111
+
112
+ setNormalState();
113
+ }
114
+
115
+ private void setNormalState() {
116
+ messageLabel.setForeground(Color.BLACK);
117
+ }
118
+
119
+ private void setErrorState() {
120
+ messageLabel.setForeground(Color.RED);
121
+ }
122
+
123
+ private class LabelAndInputField extends JPanel implements ActionListener, DocumentListener, FocusListener {
124
+ private int number;
125
+ private JLabel label;
126
+ private JTextField field;
127
+
128
+ LabelAndInputField(int number, int initialValue) {
129
+ super(new BorderLayout());
130
+ this.number = number;
131
+
132
+ field = new JTextField(""+initialValue, 3);
133
+ field.addActionListener(this);
134
+ field.getDocument().addDocumentListener(this);
135
+ field.addFocusListener(this);
136
+
137
+ label = new JLabel(number+":");
138
+
139
+ add(label, BorderLayout.WEST);
140
+ add(field, BorderLayout.CENTER);
141
+
142
+ setNormalState();
143
+ }
144
+
145
+ private void setNormalState() {
146
+ label.setForeground(Color.BLACK);
147
+ DataPanel.this.setNormalState();
148
+ }
149
+
150
+ private void setErrorState() {
151
+ label.setForeground(Color.RED);
152
+ DataPanel.this.setErrorState();
153
+ }
154
+
155
+ @Override
156
+ public void actionPerformed(ActionEvent ae) {
157
+ try {
158
+ int data = Integer.parseInt(field.getText());
159
+ listener.changed(number, data);
160
+ } catch(NumberFormatException e) {
161
+ setErrorState();
162
+ field.requestFocus();
163
+ }
164
+ }
165
+
166
+ @Override
167
+ public void removeUpdate(DocumentEvent e) { setNormalState(); }
168
+ @Override
169
+ public void insertUpdate(DocumentEvent e) { setNormalState(); }
170
+ @Override
171
+ public void changedUpdate(DocumentEvent e) { setNormalState(); }
172
+
173
+ @Override
174
+ public void focusLost(FocusEvent e) { actionPerformed(null); }
175
+ @Override
176
+ public void focusGained(FocusEvent e) {} //ignore
177
+ }
178
+ }
179
+ }
180
+ ```