• R/O
  • SSH

JdbcAcsess2: Commit

全てを再実装したJdbcAcsessです。


Commit MetaInfo

Revisionab2bf3f9fd03a048c484e2f73412a3abab297945 (tree)
Time2012-03-04 20:31:30
Authorshimakazuro
Commitershimakazuro

Log Message

セル高さ自動設定

Change Summary

Incremental Difference

diff -r fb10a3a26795 -r ab2bf3f9fd03 src/jdbcacsess2/main/TableColumnFit.java
--- a/src/jdbcacsess2/main/TableColumnFit.java Sun Mar 04 19:04:33 2012 +0900
+++ b/src/jdbcacsess2/main/TableColumnFit.java Sun Mar 04 20:31:30 2012 +0900
@@ -44,288 +44,306 @@
4444 public class TableColumnFit implements TableColumnModelListener, TableModelListener, MouseMotionListener,
4545 PropertyChangeListener {
4646
47- private final JTable jTable;
48- private boolean autoFit = false;
49-
50- public TableColumnFit(JTable jTable) {
51- this.jTable = jTable;
52- this.jTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
53- }
54-
55- /**
56- * カラム自動調整の実施可否状態
57- *
58- * @return autoFit
59- */
60- public boolean isAutoFit() {
61- return autoFit;
62- }
63-
64- /**
65- * カラム自動調整を中断または再開させる。EDTの中から実行してください。
66- *
67- * @param autoFit
68- * false の時は調整を中断する、trueの時は調整を実施する。初期値はtrue。
69- */
70- public void setEnableAutoFit(boolean autoFit) {
71- if (autoFit) {
72- // JTableの各column幅を、列の最大値幅に設定します。
73- // 最大幅は見出し/セルをフルスキャンする事で求めます。
74- setPreferredWidthFromHeader();
75- for (int row = 0; row < jTable.getModel().getRowCount(); row++) {
76- setPreferredWidthFromRoW(row);
77- }
78-
79- // 列幅変更したので画面表示を更新する。
80- jTable.doLayout();
81-
82- // 値が変わった時だけリスナー登録
83- if (this.autoFit != autoFit) {
84- JTableHeader jTableHeader = jTable.getTableHeader();
85- // Drag%Dropで列幅変更が行われた場合、自動調整を停止させたいので、
86- // Jtableヘッダーのマウスモーションを監視する。
87- if (jTableHeader != null) {
88- jTableHeader.addMouseMotionListener(this);
89- }
90-
91- // リアルタイムな行追加変更に応じて、列幅を変更したいので、
92- // テーブルモデルの値変更を監視する。
93- // 但し、テーブルモデルはabstractTableModelを実装し、fireXXXで変更を通知しなけらばならない。
94- jTable.getModel().addTableModelListener(this);
95- if (jTableHeader != null) {
96- jTableHeader.getColumnModel().addColumnModelListener(this);
97- }
98-
99- // Fontが変更された時再計算したいので、
100- // "font"のプロパティ変更を監視する。
101- jTable.addPropertyChangeListener("font", this);
102- }
103- } else {
104- // 自動調整停止時は、監視リスナーを削除する。
105- jTable.getTableHeader().removeMouseMotionListener(this);
106- jTable.getModel().removeTableModelListener(this);
107- jTable.getTableHeader().getColumnModel().removeColumnModelListener(this);
108- jTable.removePropertyChangeListener(this);
109- }
110- this.autoFit = autoFit;
111- }
112-
113- /*
114- * (非 Javadoc)
115- *
116- * @see
117- * java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent
118- * )
119- */
120- @Override
121- public void mouseDragged(MouseEvent e) {
122- // 列ヘッダーのDrag&Dropが行われたら自動列幅調整は停止する。
123- setEnableAutoFit(false);
124- }
125-
126- /*
127- * (非 Javadoc)
128- *
129- * @see
130- * javax.swing.event.TableColumnModelListener#columnAdded(javax.swing.event
131- * .TableColumnModelEvent)
132- */
133- @Override
134- public void columnAdded(TableColumnModelEvent e) {
135- if (!autoFit) {
136- return;
137- }
138- setPreferredWidthFromHeader();
139- }
140-
141- /*
142- * (非 Javadoc)
143- *
144- * @seejavax.swing.event.TableModelListener#tableChanged(javax.swing.event.
145- * TableModelEvent)
146- */
147- @Override
148- public void tableChanged(TableModelEvent event) {
149- if (!autoFit) {
150- return;
151- }
152- switch (event.getType()) {
153- case TableModelEvent.UPDATE:
154-
155- if (event.getFirstRow() == TableModelEvent.HEADER_ROW) {
156- // AbstractTableModel#fireTableStructureChanged の時らしいが、
157- // DefaultTableColumnModel では、カラム数=0 で呼ばれる為、その時は意味の無い処理となる。
158- // 但し、JTable#setModel の時も呼ばれるがので、その時意味がある。
159- setPreferredWidthFromHeader();
160- } else {
161- int cnt = jTable.getModel().getRowCount();
162- if (event.getLastRow() < cnt) {
163- cnt = event.getLastRow();
164- }
165- for (int row = event.getFirstRow(); row < cnt; row++) {
166- setPreferredWidthFromRoW(row);
167- }
168- }
169- break;
170-
171- case TableModelEvent.INSERT:
172-
173- for (int row = event.getFirstRow(); row <= event.getLastRow(); row++) {
174- setPreferredWidthFromRoW(row);
175- }
176- break;
177-
178- default:
179- break;
180- }
181- }
47+ private final JTable jTable;
48+ private boolean autoFit = false;
18249
183- /**
184- * JTableのヘッダcolumn内容でセル幅を設定します。
185- *
186- * @param jTable
187- * column幅を変更したいJTable
188- */
189- private void setPreferredWidthFromHeader() {
190- JTableHeader tableHeader = jTable.getTableHeader();
191- TableCellRenderer defrenderer = null;
192- if (tableHeader != null) {
193- defrenderer = tableHeader.getDefaultRenderer();
194- }
195- TableColumnModel tcm = jTable.getColumnModel();
196-
197- Enumeration<TableColumn> e = tcm.getColumns();
198- while (e.hasMoreElements()) {
199- TableColumn tableColumn = e.nextElement();
200-
201- TableCellRenderer r = tableColumn.getCellRenderer();
202- if (r == null) {
203- // 個別設定が無いのでデフォルトを使用する
204- if (defrenderer != null) {
205- r = defrenderer;
206- } else {
207- return;
208- }
209- }
210- JComponent c = (JComponent) r.getTableCellRendererComponent(jTable,
211- tableColumn.getHeaderValue(),
212- false,
213- false,
214- -1,
215- 0);
216- int w = preferredWidth(c);
217- tableColumn.setPreferredWidth(w);
218- }
219- }
220-
221- /**
222- * JTableの行column内容でセル幅を設定します。
223- *
224- * @param row
225- * columha幅を変更したい行
226- */
227- private void setPreferredWidthFromRoW(int row) {
228- for (int column = 0; column < jTable.getColumnCount(); column++) {
229- TableColumn tableColumn = jTable.getColumnModel().getColumn(column);
230-
231- TableCellRenderer r = jTable.getCellRenderer(row, column);
232- // cellの値を getValueAt で取得し、レンダラーにて表示後コンポーネントを作成する。
233- // 作成したコンポーネントは、勿体無いけど捨ててしまう。
234- // JTable#getValueAt は view座標指定なので、TableModel#getValueAt
235- // でモデル座標で取得する。
236- JComponent c = (JComponent) r.getTableCellRendererComponent(jTable,
237- jTable.getModel().getValueAt(row, column),
238- false,
239- false,
240- row,
241- column);
242- int w = preferredWidth(c);
243- if (tableColumn.getPreferredWidth() < w) {
244- tableColumn.setPreferredWidth(w);
245- }
246- }
247- }
50+ public TableColumnFit(JTable jTable) {
51+ this.jTable = jTable;
52+ this.jTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
53+ }
24854
249- /**
250- * セルコンポーネントの幅を計算する
251- *
252- * @param jComponent
253- * セルコンポーネント
254- * @return セルコンポーネントの幅に余白幅を加算した値
255- */
256- private int preferredWidth(JComponent jComponent) {
257- int rtn = jComponent.getPreferredSize().width + jComponent.getInsets().left + jComponent.getInsets().right
258- + jTable.getIntercellSpacing().width;
259- return rtn;
260- }
261-
262- /*
263- * (非 Javadoc)
264- *
265- * @see java.beans.PropertyChangeListener#propertyChange(java.beans.
266- * PropertyChangeEvent)
267- */
268- @Override
269- public void propertyChange(PropertyChangeEvent evt) {
270- setPreferredWidthFromHeader();
271- for (int row = 0; row < jTable.getModel().getRowCount(); row++) {
272- setPreferredWidthFromRoW(row);
273- }
274- }
275-
276- /*
277- * (非 Javadoc)
278- *
279- * @see
280- * java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)
281- */
282- @Override
283- public void mouseMoved(MouseEvent e) {
284- }
55+ /**
56+ * カラム自動調整の実施可否状態
57+ *
58+ * @return autoFit
59+ */
60+ public boolean isAutoFit() {
61+ return autoFit;
62+ }
28563
286- /*
287- * (非 Javadoc)
288- *
289- * @see
290- * javax.swing.event.TableColumnModelListener#columnMarginChanged(javax.
291- * swing.event.ChangeEvent)
292- */
293- @Override
294- public void columnMarginChanged(ChangeEvent e) {
295- }
64+ /**
65+ * カラム自動調整を中断または再開させる。EDTの中から実行してください。
66+ *
67+ * @param autoFit
68+ * false の時は調整を中断する、trueの時は調整を実施する。初期値はtrue。
69+ */
70+ public void setEnableAutoFit(boolean autoFit) {
71+ if (autoFit) {
72+ // JTableの各column幅を、列の最大値幅に設定します。
73+ // 最大幅は見出し/セルをフルスキャンする事で求めます。
74+ setPreferredWidthFromHeader();
75+ for (int row = 0; row < jTable.getModel().getRowCount(); row++) {
76+ setPreferredSizeFromRoW(row);
77+ }
29678
297- /*
298- * (非 Javadoc)
299- *
300- * @see
301- * javax.swing.event.TableColumnModelListener#columnMoved(javax.swing.event
302- * .TableColumnModelEvent)
303- */
304- @Override
305- public void columnMoved(TableColumnModelEvent e) {
306- }
79+ // 列幅変更したので画面表示を更新する。
80+ jTable.doLayout();
30781
308- /*
309- * (非 Javadoc)
310- *
311- * @see
312- * javax.swing.event.TableColumnModelListener#columnRemoved(javax.swing.
313- * event.TableColumnModelEvent)
314- */
315- @Override
316- public void columnRemoved(TableColumnModelEvent e) {
317- }
82+ // 値が変わった時だけリスナー登録
83+ if (this.autoFit != autoFit) {
84+ JTableHeader jTableHeader = jTable.getTableHeader();
85+ // Drag%Dropで列幅変更が行われた場合、自動調整を停止させたいので、
86+ // Jtableヘッダーのマウスモーションを監視する。
87+ if (jTableHeader != null) {
88+ jTableHeader.addMouseMotionListener(this);
89+ }
31890
319- /*
320- * (非 Javadoc)
321- *
322- * @see
323- * javax.swing.event.TableColumnModelListener#columnSelectionChanged(javax
324- * .swing.event.ListSelectionEvent)
325- */
326- @Override
327- public void columnSelectionChanged(ListSelectionEvent e) {
328- }
91+ // リアルタイムな行追加変更に応じて、列幅を変更したいので、
92+ // テーブルモデルの値変更を監視する。
93+ // 但し、テーブルモデルはabstractTableModelを実装し、fireXXXで変更を通知しなけらばならない。
94+ jTable.getModel().addTableModelListener(this);
95+ if (jTableHeader != null) {
96+ jTableHeader.getColumnModel().addColumnModelListener(this);
97+ }
98+
99+ // Fontが変更された時再計算したいので、
100+ // "font"のプロパティ変更を監視する。
101+ jTable.addPropertyChangeListener("font", this);
102+ }
103+ } else {
104+ // 自動調整停止時は、監視リスナーを削除する。
105+ jTable.getTableHeader().removeMouseMotionListener(this);
106+ jTable.getModel().removeTableModelListener(this);
107+ jTable.getTableHeader().getColumnModel().removeColumnModelListener(this);
108+ jTable.removePropertyChangeListener(this);
109+ }
110+ this.autoFit = autoFit;
111+ }
112+
113+ /*
114+ * (非 Javadoc)
115+ *
116+ * @see
117+ * java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent
118+ * )
119+ */
120+ @Override
121+ public void mouseDragged(MouseEvent e) {
122+ // 列ヘッダーのDrag&Dropが行われたら自動列幅調整は停止する。
123+ setEnableAutoFit(false);
124+ }
125+
126+ /*
127+ * (非 Javadoc)
128+ *
129+ * @see
130+ * javax.swing.event.TableColumnModelListener#columnAdded(javax.swing.event
131+ * .TableColumnModelEvent)
132+ */
133+ @Override
134+ public void columnAdded(TableColumnModelEvent e) {
135+ if (!autoFit) {
136+ return;
137+ }
138+ setPreferredWidthFromHeader();
139+ }
140+
141+ /*
142+ * (非 Javadoc)
143+ *
144+ * @seejavax.swing.event.TableModelListener#tableChanged(javax.swing.event.
145+ * TableModelEvent)
146+ */
147+ @Override
148+ public void tableChanged(TableModelEvent event) {
149+ if (!autoFit) {
150+ return;
151+ }
152+ switch (event.getType()) {
153+ case TableModelEvent.UPDATE:
154+
155+ if (event.getFirstRow() == TableModelEvent.HEADER_ROW) {
156+ // AbstractTableModel#fireTableStructureChanged の時らしいが、
157+ // DefaultTableColumnModel では、カラム数=0 で呼ばれる為、その時は意味の無い処理となる。
158+ // 但し、JTable#setModel の時も呼ばれるがので、その時意味がある。
159+ setPreferredWidthFromHeader();
160+ } else {
161+ int cnt = jTable.getModel().getRowCount();
162+ if (event.getLastRow() < cnt) {
163+ cnt = event.getLastRow();
164+ }
165+ for (int row = event.getFirstRow(); row < cnt; row++) {
166+ setPreferredSizeFromRoW(row);
167+ }
168+ }
169+ break;
170+
171+ case TableModelEvent.INSERT:
172+
173+ for (int row = event.getFirstRow(); row <= event.getLastRow(); row++) {
174+ setPreferredSizeFromRoW(row);
175+ }
176+ break;
177+
178+ default:
179+ break;
180+ }
181+ }
182+
183+ /**
184+ * JTableのヘッダcolumn内容でセル幅を設定します。
185+ *
186+ * @param jTable
187+ * column幅を変更したいJTable
188+ */
189+ private void setPreferredWidthFromHeader() {
190+ JTableHeader tableHeader = jTable.getTableHeader();
191+ TableCellRenderer defrenderer = null;
192+ if (tableHeader != null) {
193+ defrenderer = tableHeader.getDefaultRenderer();
194+ }
195+ TableColumnModel tcm = jTable.getColumnModel();
196+
197+ Enumeration<TableColumn> e = tcm.getColumns();
198+ while (e.hasMoreElements()) {
199+ TableColumn tableColumn = e.nextElement();
200+
201+ TableCellRenderer r = tableColumn.getCellRenderer();
202+ if (r == null) {
203+ // 個別設定が無いのでデフォルトを使用する
204+ if (defrenderer != null) {
205+ r = defrenderer;
206+ } else {
207+ return;
208+ }
209+ }
210+ JComponent c = (JComponent) r.getTableCellRendererComponent(jTable,
211+ tableColumn.getHeaderValue(),
212+ false,
213+ false,
214+ -1,
215+ 0);
216+ int w = preferredWidth(c);
217+ tableColumn.setPreferredWidth(w);
218+ }
219+ jTable.setRowHeight(1);
220+ }
221+
222+ /**
223+ * JTableの行column内容でセル幅と高さを設定します。
224+ *
225+ * @param row
226+ * column幅高さを変更したい行
227+ */
228+ private void setPreferredSizeFromRoW(int row) {
229+ for (int column = 0; column < jTable.getColumnCount(); column++) {
230+ TableColumn tableColumn = jTable.getColumnModel().getColumn(column);
231+
232+ TableCellRenderer r = jTable.getCellRenderer(row, column);
233+ // cellの値を getValueAt で取得し、レンダラーにて表示後コンポーネントを作成する。
234+ // 作成したコンポーネントは、勿体無いけど捨ててしまう。
235+ // JTable#getValueAt は view座標指定なので、TableModel#getValueAt
236+ // でモデル座標で取得する。
237+ JComponent c = (JComponent) r.getTableCellRendererComponent(jTable,
238+ jTable.getModel().getValueAt(row, column),
239+ false,
240+ false,
241+ row,
242+ column);
243+ int w = preferredWidth(c);
244+ if (tableColumn.getPreferredWidth() < w) {
245+ tableColumn.setPreferredWidth(w);
246+ }
247+
248+ int h = preferredHeight(c);
249+ if (jTable.getRowHeight() < h) {
250+ jTable.setRowHeight(h);
251+ }
252+ }
253+ }
254+
255+ /**
256+ * セルコンポーネントの幅を計算する
257+ *
258+ * @param jComponent
259+ * セルコンポーネント
260+ * @return セルコンポーネントの幅に余白幅を加算した値
261+ */
262+ private int preferredWidth(JComponent jComponent) {
263+ int rtn = jComponent.getPreferredSize().width + jComponent.getInsets().left + jComponent.getInsets().right
264+ + jTable.getIntercellSpacing().width;
265+ return rtn;
266+ }
267+
268+ /**
269+ * セルコンポーネントの高さを計算する
270+ *
271+ * @param jComponent
272+ * セルコンポーネント
273+ * @return セルコンポーネントの幅に余白幅を加算した値
274+ */
275+ private int preferredHeight(JComponent jComponent) {
276+ int rtn = jComponent.getPreferredSize().height;
277+ return rtn;
278+ }
279+
280+ /*
281+ * (非 Javadoc)
282+ *
283+ * @see java.beans.PropertyChangeListener#propertyChange(java.beans.
284+ * PropertyChangeEvent)
285+ */
286+ @Override
287+ public void propertyChange(PropertyChangeEvent evt) {
288+ setPreferredWidthFromHeader();
289+ for (int row = 0; row < jTable.getModel().getRowCount(); row++) {
290+ setPreferredSizeFromRoW(row);
291+ }
292+ }
293+
294+ /*
295+ * (非 Javadoc)
296+ *
297+ * @see
298+ * java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)
299+ */
300+ @Override
301+ public void mouseMoved(MouseEvent e) {
302+ }
303+
304+ /*
305+ * (非 Javadoc)
306+ *
307+ * @see
308+ * javax.swing.event.TableColumnModelListener#columnMarginChanged(javax.
309+ * swing.event.ChangeEvent)
310+ */
311+ @Override
312+ public void columnMarginChanged(ChangeEvent e) {
313+ }
314+
315+ /*
316+ * (非 Javadoc)
317+ *
318+ * @see
319+ * javax.swing.event.TableColumnModelListener#columnMoved(javax.swing.event
320+ * .TableColumnModelEvent)
321+ */
322+ @Override
323+ public void columnMoved(TableColumnModelEvent e) {
324+ }
325+
326+ /*
327+ * (非 Javadoc)
328+ *
329+ * @see
330+ * javax.swing.event.TableColumnModelListener#columnRemoved(javax.swing.
331+ * event.TableColumnModelEvent)
332+ */
333+ @Override
334+ public void columnRemoved(TableColumnModelEvent e) {
335+ }
336+
337+ /*
338+ * (非 Javadoc)
339+ *
340+ * @see
341+ * javax.swing.event.TableColumnModelListener#columnSelectionChanged(javax
342+ * .swing.event.ListSelectionEvent)
343+ */
344+ @Override
345+ public void columnSelectionChanged(ListSelectionEvent e) {
346+ }
329347
330348
331349 }
Show on old repository browser