テキストの各行をキーと値に分離し、複数テキストファイルを読み込み、キーを突き合わせ照合し、その結果を表示するGUIユーテリティです。
修訂 | 5aa08f746bc14ff91d768e6c988e0087e973324b (tree) |
---|---|
時間 | 2011-10-23 02:28:50 |
作者 | seraphy <seraphy@192....> |
Commiter | seraphy |
・データがないセルは灰色の背景色とする
@@ -33,7 +33,7 @@ public enum DisplayMode implements RowFilter { | ||
33 | 33 | int mx = values.getDataWidth(); |
34 | 34 | int validColumns = 0; |
35 | 35 | for (int idx = 0; idx < mx; idx++) { |
36 | - int cnt = values.getCount(idx); | |
36 | + int cnt = values.getRowCountAt(idx); | |
37 | 37 | if (cnt > 0) { |
38 | 38 | // 1件以上のデータがあるカラムをカウントする. |
39 | 39 | validColumns++; |
@@ -55,7 +55,7 @@ public enum DisplayMode implements RowFilter { | ||
55 | 55 | int mx = values.getDataWidth(); |
56 | 56 | int validColumns = 0; |
57 | 57 | for (int idx = 0; idx < mx; idx++) { |
58 | - int cnt = values.getCount(idx); | |
58 | + int cnt = values.getRowCountAt(idx); | |
59 | 59 | if (cnt > 0) { |
60 | 60 | // 1件以上のデータがあるカラムをカウントする. |
61 | 61 | validColumns++; |
@@ -76,7 +76,7 @@ public enum DisplayMode implements RowFilter { | ||
76 | 76 | } |
77 | 77 | int mx = values.getDataWidth(); |
78 | 78 | if (mx > 0) { |
79 | - int cnt = values.getCount(0); | |
79 | + int cnt = values.getRowCountAt(0); | |
80 | 80 | if (cnt > 0) { |
81 | 81 | return true; |
82 | 82 | } |
@@ -95,7 +95,7 @@ public enum DisplayMode implements RowFilter { | ||
95 | 95 | } |
96 | 96 | int mx = values.getDataWidth(); |
97 | 97 | if (mx > 0) { |
98 | - int cnt = values.getCount(0); | |
98 | + int cnt = values.getRowCountAt(0); | |
99 | 99 | if (cnt == 0) { |
100 | 100 | return true; |
101 | 101 | } |
@@ -112,7 +112,7 @@ public enum DisplayMode implements RowFilter { | ||
112 | 112 | int mx = values.getDataWidth(); |
113 | 113 | int validColumns = 0; |
114 | 114 | for (int idx = 0; idx < mx; idx++) { |
115 | - int cnt = values.getCount(idx); | |
115 | + int cnt = values.getRowCountAt(idx); | |
116 | 116 | if (cnt > 0) { |
117 | 117 | // 1件以上のデータがあるカラムをカウントする. |
118 | 118 | validColumns++; |
@@ -131,7 +131,7 @@ public enum DisplayMode implements RowFilter { | ||
131 | 131 | int mx = values.getDataWidth(); |
132 | 132 | int validColumns = 0; |
133 | 133 | for (int idx = 0; idx < mx; idx++) { |
134 | - int cnt = values.getCount(idx); | |
134 | + int cnt = values.getRowCountAt(idx); | |
135 | 135 | if (cnt > 0) { |
136 | 136 | // 1件以上のデータがあるカラムをカウントする. |
137 | 137 | validColumns++; |
@@ -150,7 +150,7 @@ public enum DisplayMode implements RowFilter { | ||
150 | 150 | int mx = values.getDataWidth(); |
151 | 151 | int numOfData = 0; |
152 | 152 | for (int idx = 0; idx < mx; idx++) { |
153 | - int cnt = values.getCount(idx); | |
153 | + int cnt = values.getRowCountAt(idx); | |
154 | 154 | numOfData += cnt; |
155 | 155 | } |
156 | 156 | // データ数が1であればユニーク |
@@ -166,7 +166,7 @@ public enum DisplayMode implements RowFilter { | ||
166 | 166 | int mx = values.getDataWidth(); |
167 | 167 | int numOfData = 0; |
168 | 168 | for (int idx = 0; idx < mx; idx++) { |
169 | - int cnt = values.getCount(idx); | |
169 | + int cnt = values.getRowCountAt(idx); | |
170 | 170 | numOfData += cnt; |
171 | 171 | } |
172 | 172 | // データ数が1でなければアンユニーク |
@@ -197,7 +197,7 @@ public class KeyMatchedRowView extends AbstractTableModel { | ||
197 | 197 | } |
198 | 198 | |
199 | 199 | // このキーに対して最大何行のデータがついているか? |
200 | - int numOfRows = rowValues.getMaxCount(); | |
200 | + int numOfRows = rowValues.getMaxRowCount(); | |
201 | 201 | |
202 | 202 | // 行数分だけ同じキーを繰り返す. |
203 | 203 | for (int rowNumber = 0; rowNumber < numOfRows; rowNumber++) { |
@@ -13,6 +13,16 @@ import java.util.List; | ||
13 | 13 | * @author seraphy |
14 | 14 | */ |
15 | 15 | public class RowValues { |
16 | + | |
17 | + /** | |
18 | + * データとしてNULLが登録されたことを示す.<br> | |
19 | + */ | |
20 | + public static final Object NULL_VALUE = new Object() { | |
21 | + @Override | |
22 | + public String toString() { | |
23 | + return "<NULL>"; | |
24 | + } | |
25 | + }; | |
16 | 26 | |
17 | 27 | /** |
18 | 28 | * データソースごとのデータを入れる配列.<br> |
@@ -40,29 +50,34 @@ public class RowValues { | ||
40 | 50 | |
41 | 51 | /** |
42 | 52 | * データソースと、値を指定してデータをセットする.<br> |
43 | - * 同じデータソースですでにデータがある場合はリストとして追加される.<br> | |
44 | - * @param column データソース添字 | |
45 | - * @param value データ、nullは空文字として登録される | |
53 | + * @param dataIndex データソース添字 | |
54 | + * @param value データ、null可 | |
46 | 55 | */ |
47 | - public void add(int column, String value) { | |
56 | + public void add(int dataIndex, String value) { | |
57 | + Object val; | |
48 | 58 | if (value == null) { |
49 | - value = ""; | |
59 | + val = NULL_VALUE; | |
60 | + } else { | |
61 | + val = value; | |
50 | 62 | } |
51 | - if (datas[column] == null) { | |
63 | + | |
64 | + if (datas[dataIndex] == null) { | |
52 | 65 | // 新規の場合 |
53 | - datas[column] = value; | |
54 | - } else if (datas[column] instanceof List) { | |
66 | + datas[dataIndex] = val; | |
67 | + | |
68 | + } else if (datas[dataIndex] instanceof List) { | |
55 | 69 | // すでに2要素以上ある場合 |
56 | 70 | @SuppressWarnings(value = "unchecked") |
57 | - List<String> lst = (List<String>) datas[column]; | |
58 | - lst.add(value); | |
71 | + List<Object> lst = (List<Object>) datas[dataIndex]; | |
72 | + lst.add(val); | |
73 | + | |
59 | 74 | } else { |
60 | 75 | // すでに存在する場合はリストにつめ直す. |
61 | - assert datas[column] instanceof String; | |
62 | - List<String> tmp = new ArrayList<String>(); | |
63 | - tmp.add((String) datas[column]); | |
64 | - tmp.add(value); | |
65 | - datas[column] = tmp; | |
76 | + assert datas[dataIndex] instanceof String; | |
77 | + List<Object> tmp = new ArrayList<Object>(); | |
78 | + tmp.add(datas[dataIndex]); | |
79 | + tmp.add(val); | |
80 | + datas[dataIndex] = tmp; | |
66 | 81 | } |
67 | 82 | } |
68 | 83 |
@@ -71,11 +86,11 @@ public class RowValues { | ||
71 | 86 | * すべてのデータソースにひとつもデータがなければ0となる.<br> |
72 | 87 | * @return 最大のデータ数 |
73 | 88 | */ |
74 | - public int getMaxCount() { | |
89 | + public int getMaxRowCount() { | |
75 | 90 | int mx = 0; |
76 | 91 | int dataWidth = datas.length; |
77 | 92 | for (int dataIndex = 0; dataIndex < dataWidth; dataIndex++) { |
78 | - int count = getCount(dataIndex); | |
93 | + int count = getRowCountAt(dataIndex); | |
79 | 94 | if (count > mx) { |
80 | 95 | mx = count; |
81 | 96 | } |
@@ -85,19 +100,19 @@ public class RowValues { | ||
85 | 100 | |
86 | 101 | /** |
87 | 102 | * 指定したデータソースのデータの個数を返す. |
88 | - * @param column 添字 | |
103 | + * @param dataIndex 添字 | |
89 | 104 | * @return データの個数、未登録ならば0 |
90 | 105 | */ |
91 | - public int getCount(int column) { | |
92 | - if (column < 0 || column >= datas.length) { | |
106 | + public int getRowCountAt(int dataIndex) { | |
107 | + if (dataIndex < 0 || dataIndex >= datas.length) { | |
93 | 108 | // 範囲外、データがないので0を返す. |
94 | 109 | return 0; |
95 | 110 | } |
96 | - Object data = datas[column]; | |
111 | + Object data = datas[dataIndex]; | |
97 | 112 | if (data != null && data instanceof List) { |
98 | 113 | // リスト格納であれば、要素数を返す |
99 | 114 | @SuppressWarnings(value = "unchecked") |
100 | - List<String> lst = (List<String>) datas[column]; | |
115 | + List<Object> lst = (List<Object>) datas[dataIndex]; | |
101 | 116 | return lst.size(); |
102 | 117 | } |
103 | 118 | // 非nullで、リストでなければ単一要素なので1を返す |
@@ -110,35 +125,59 @@ public class RowValues { | ||
110 | 125 | |
111 | 126 | /** |
112 | 127 | * 指定したデータソースの指定した番号のデータを取り出す.<br> |
113 | - * 範囲外、もしくはデータ未登録である場合は空文字が返される.<br> | |
128 | + * データ未登録である場合、および範囲外を指定した場合はnullが返される.<br> | |
129 | + * データがnull値の場合は{@link #NULL_VALUE}が返される.<br> | |
114 | 130 | * @param column データソース番号 |
115 | 131 | * @param rowIndex データのインデックス、getCountで得られる個数分 |
116 | - * @return データ、無し、もしくは範囲外の場合は空文字 | |
132 | + * @return データ、{@link #NULL_VALUE}、もしくはデータなしの場合および範囲外の場合はnull | |
117 | 133 | */ |
118 | - public String get(int column, int rowIndex) { | |
134 | + public Object getRaw(int column, int rowIndex) { | |
119 | 135 | if (column < 0 || column >= datas.length) { |
120 | - return ""; | |
136 | + return null; | |
121 | 137 | } |
122 | 138 | Object data = datas[column]; |
123 | 139 | if (data == null) { |
124 | - return ""; | |
140 | + // このカラムでは、データ未登録 | |
141 | + return null; | |
125 | 142 | } |
143 | + | |
126 | 144 | if (data instanceof List) { |
127 | 145 | @SuppressWarnings(value = "unchecked") |
128 | - List<String> lst = (List<String>) data; | |
146 | + List<Object> lst = (List<Object>) data; | |
129 | 147 | if (rowIndex >= 0 && rowIndex < lst.size()) { |
130 | 148 | // 複数データならば存在する行分だけ |
131 | 149 | return lst.get(rowIndex); |
132 | 150 | } |
133 | 151 | // 範囲外であればデータなし |
134 | - return ""; | |
152 | + return null; | |
135 | 153 | } |
154 | + | |
136 | 155 | if (rowIndex == 0) { |
137 | - // 単一データは先頭行のみ | |
138 | - return (String) data; | |
156 | + // 単一データは先頭行のみ (データ未登録の場合はnull) | |
157 | + return data; | |
139 | 158 | } |
140 | 159 | // 単一データで次行以降はデータなし。 |
141 | - return ""; | |
160 | + return null; | |
161 | + } | |
162 | + | |
163 | + /** | |
164 | + * 指定したデータソースの指定した番号のデータを取り出す.<br> | |
165 | + * データ未登録である場合、および範囲外を指定した場合はnullが返される.<br> | |
166 | + * 登録データがNULL値である場合は空文字が返される.<bf> | |
167 | + * @param column データソース番号 | |
168 | + * @param rowIndex データのインデックス、getCountで得られる個数分 | |
169 | + * @return データ、もしくは空白、データなしの場合および範囲外の場合はnull | |
170 | + */ | |
171 | + public String get(int column, int rowIndex) { | |
172 | + Object value = getRaw(column, rowIndex); | |
173 | + assert value == null || value instanceof String || NULL_VALUE.equals(value); | |
174 | + if (value != null) { | |
175 | + if (NULL_VALUE.equals(value)) { | |
176 | + return ""; | |
177 | + } | |
178 | + return (String) value; | |
179 | + } | |
180 | + return null; | |
142 | 181 | } |
143 | 182 | |
144 | 183 | } |
@@ -58,10 +58,15 @@ public class TextKeyMatcherView extends FrameView implements ExitListener { | ||
58 | 58 | private static final Logger logger = Logger.getLogger(TextKeyMatcherView.class.getName()); |
59 | 59 | |
60 | 60 | /** |
61 | - * テーブルの偶数行のカラー | |
61 | + * テーブルの偶数行の背景色 | |
62 | 62 | */ |
63 | 63 | private Color evenColor = new Color(240, 240, 255); |
64 | 64 | |
65 | + /** | |
66 | + * データがnullである場合の背景色 | |
67 | + */ | |
68 | + private Color nullValueColor = new Color(220, 220, 220); | |
69 | + | |
65 | 70 | |
66 | 71 | public TextKeyMatcherView(SingleFrameApplication app) { |
67 | 72 | super(app); |
@@ -175,9 +180,15 @@ public class TextKeyMatcherView extends FrameView implements ExitListener { | ||
175 | 180 | |
176 | 181 | } else { |
177 | 182 | setForeground(table.getForeground()); |
178 | - int serialNo = dataViewTableModel.getRowGroupSerialNo(row); | |
179 | - boolean even = (serialNo % 2 == 0); | |
180 | - setBackground(even ? getEvenColor() : table.getBackground()); | |
183 | + | |
184 | + if (value == null) { | |
185 | + setBackground(getNullValueColor()); | |
186 | + | |
187 | + } else { | |
188 | + int serialNo = dataViewTableModel.getRowGroupSerialNo(row); | |
189 | + boolean even = (serialNo % 2 == 0); | |
190 | + setBackground(even ? getEvenColor() : table.getBackground()); | |
191 | + } | |
181 | 192 | } |
182 | 193 | |
183 | 194 | setHorizontalAlignment((value instanceof Number) ? RIGHT : LEFT); |
@@ -208,6 +219,23 @@ public class TextKeyMatcherView extends FrameView implements ExitListener { | ||
208 | 219 | public Color getEvenColor() { |
209 | 220 | return this.evenColor; |
210 | 221 | } |
222 | + | |
223 | + public void setNullValueColor(Color nullValueColor) { | |
224 | + if (nullValueColor == null) { | |
225 | + throw new IllegalArgumentException(); | |
226 | + } | |
227 | + Color oldValue = this.nullValueColor; | |
228 | + this.nullValueColor = nullValueColor; | |
229 | + firePropertyChange("nullValueColor", oldValue, nullValueColor); | |
230 | + } | |
231 | + | |
232 | + /** | |
233 | + * データがnullである場合の背景色を取得する. | |
234 | + * @return 背景色 | |
235 | + */ | |
236 | + public Color getNullValueColor() { | |
237 | + return this.nullValueColor; | |
238 | + } | |
211 | 239 | |
212 | 240 | /** |
213 | 241 | * アプリケーション情報ダイアログを表示する. |