• R/O
  • SSH

JdbcAcsess2: Commit

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


Commit MetaInfo

Revisionb6558ad47c50be95a7d6626445a953da4878038b (tree)
Time2012-03-04 12:13:41
Authorshimakazuro
Commitershimakazuro

Log Message

Fontズーム汎用化

Change Summary

Incremental Difference

diff -r 45db3cb8b39f -r b6558ad47c50 src/jdbcacsess2/main/FontZoomByMouseWheel.java
--- a/src/jdbcacsess2/main/FontZoomByMouseWheel.java Sat Mar 03 21:58:07 2012 +0900
+++ b/src/jdbcacsess2/main/FontZoomByMouseWheel.java Sun Mar 04 12:13:41 2012 +0900
@@ -29,56 +29,64 @@
2929 */
3030 public class FontZoomByMouseWheel {
3131
32- private final Component component;
33-
34- public FontZoomByMouseWheel(Component c) {
35- this.component = c;
36- component.addKeyListener(new KeyListener() {
37-
38- @Override
39- public void keyPressed(KeyEvent e) {
40- if (e.getKeyCode() == KeyEvent.VK_CONTROL) {
41- component.addMouseWheelListener(mouseWheelListener);
42- }
43- }
44-
45- @Override
46- public void keyReleased(KeyEvent e) {
47- if (e.getKeyCode() == KeyEvent.VK_CONTROL) {
48- component.removeMouseWheelListener(mouseWheelListener);
49- }
50- }
51-
52- @Override
53- public void keyTyped(KeyEvent e) {
54- }
32+ private final Component component;
33+ private boolean press = false;
5534
56- });
57-
58- }
59-
60- private final MouseWheelListener mouseWheelListener = new MouseWheelListener() {
35+ public FontZoomByMouseWheel(Component c) {
36+ this.component = c;
37+ component.addKeyListener(new KeyListener() {
6138
62- /*
63- * (非 Javadoc)
64- *
65- * @see
66- * java.awt.event.MouseWheelListener#mouseWheelMoved(java.awt.event.
67- * MouseWheelEvent)
68- */
69- @Override
70- public void mouseWheelMoved(MouseWheelEvent e) {
71- if (!e.isControlDown()) {
72- return;
73- }
39+ @Override
40+ public void keyPressed(KeyEvent e) {
41+ if (press) {
42+ return;
43+ }
44+ if (e.getKeyCode() == KeyEvent.VK_CONTROL) {
45+ component.addMouseWheelListener(mouseWheelListener);
46+ Jdbcacsess2.logger.fine("font=" + component.getFont());
47+ press = true;
48+ }
49+ }
7450
75- Font font = component.getFont();
76- float size = font.getSize() + e.getWheelRotation();
51+ @Override
52+ public void keyReleased(KeyEvent e) {
53+ if (e.getKeyCode() == KeyEvent.VK_CONTROL) {
54+ component.removeMouseWheelListener(mouseWheelListener);
55+ Jdbcacsess2.logger.fine("font=" + component.getFont());
56+ press = false;
57+ }
58+ }
7759
78- component.setFont(font.deriveFont(size));
60+ @Override
61+ public void keyTyped(KeyEvent e) {
62+ // 押す&離すで発生するイベントなので使用しない
63+ }
7964
80- e.consume();
81- }
82- };
65+ });
66+
67+ }
68+
69+ private final MouseWheelListener mouseWheelListener = new MouseWheelListener() {
70+
71+ /*
72+ * (非 Javadoc)
73+ *
74+ * @see
75+ * java.awt.event.MouseWheelListener#mouseWheelMoved(java.awt.event.
76+ * MouseWheelEvent)
77+ */
78+ @Override
79+ public void mouseWheelMoved(MouseWheelEvent e) {
80+ if (!e.isControlDown()) {
81+ return;
82+ }
83+
84+ Font font = component.getFont();
85+ float size = font.getSize() + e.getWheelRotation();
86+
87+ component.setFont(font.deriveFont(size));
88+ e.consume();
89+ }
90+ };
8391
8492 }
diff -r 45db3cb8b39f -r b6558ad47c50 src/jdbcacsess2/main/JmyTable.java
--- a/src/jdbcacsess2/main/JmyTable.java Sat Mar 03 21:58:07 2012 +0900
+++ b/src/jdbcacsess2/main/JmyTable.java Sun Mar 04 12:13:41 2012 +0900
@@ -38,186 +38,186 @@
3838 */
3939 public class JmyTable extends JXTable {
4040
41- private static final long serialVersionUID = -7507194043135028576L;
42-
43- public JmyTable() {
44- super();
45- initialize();
46- }
47-
48- /**
49- * @param dm
50- */
51- public JmyTable(TableModel dm) {
52- super(dm);
53- initialize();
54- }
55-
56- /**
57- * @param dm
58- * @param cm
59- */
60- public JmyTable(TableModel dm, TableColumnModel cm) {
61- super(dm, cm);
62- initialize();
63- }
64-
65- /**
66- * @param numRows
67- * @param numColumns
68- */
69- public JmyTable(int numRows, int numColumns) {
70- super(numRows, numColumns);
71- initialize();
72- }
73-
74- /**
75- * @param rowData
76- * @param columnNames
77- */
78- public JmyTable(Vector<?> rowData, Vector<?> columnNames) {
79- super(rowData, columnNames);
80- initialize();
81- }
82-
83- /**
84- * @param rowData
85- * @param columnNames
86- */
87- public JmyTable(Object[][] rowData, Object[] columnNames) {
88- super(rowData, columnNames);
89- initialize();
90- }
91-
92- /**
93- * @param dm
94- * @param cm
95- * @param sm
96- */
97- public JmyTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) {
98- super(dm, cm, sm);
99- initialize();
100- }
101-
102- private void initialize() {
103- setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
104- setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
105- setShowVerticalLines(false);
106- setShowHorizontalLines(false);
107- setHighlighters(HighlighterFactory.createSimpleStriping());
108- // setCellSelectionEnabled(true);
109- setRowSelectionAllowed(true);
110- setAutoCreateRowSorter(true);
111- setEditable(false);
112- new FontZoomByMouseWheel(this);
113- }
114-
115- @Override
116- public void setModel(TableModel tableModel) {
117- super.setModel(tableModel);
118- new TableColumnFit(this).setEnableAutoFit(true);
119- TableRowFilterSupport.forTable(this).searchable(true).apply();
120- tableModel.addTableModelListener(tableModelListener);
121- setSortsOnUpdates(true);
122- }
41+ private static final long serialVersionUID = -7507194043135028576L;
12342
124- /**
125- * @return
126- */
127- public int getSelectedModelRow() {
128- int row = getSelectedRow();
129- if (row < 0) {
130- return -1;
131- }
132- return convertRowIndexToModel(row);
133- }
134-
135- /**
136- * @return
137- */
138- public int getSelectedModelColumn() {
139- int column = getSelectedColumn();
140- if (column < 0) {
141- return -1;
142- }
143- return convertColumnIndexToModel(column);
144- }
145-
146- /**
147- * @return
148- */
149- public ArrayList<Integer> getSelectedModelRows() {
150- int[] rows = getSelectedRows();
151- ArrayList<Integer> list = new ArrayList<Integer>(rows.length);
152- for (int i = 0; i < rows.length; i++) {
153- list.add(convertRowIndexToModel(rows[i]));
154- }
155- return list;
156- }
157-
158- /**
159- * @return
160- */
161- public ArrayList<Integer> getSelectedModelColumns() {
162- int[] columns = getSelectedColumns();
163- ArrayList<Integer> list = new ArrayList<Integer>(columns.length);
164- for (int i = 0; i < columns.length; i++) {
165- list.add(convertColumnIndexToModel(columns[i]));
166- }
167- return list;
168- }
43+ public JmyTable() {
44+ super();
45+ initialize();
46+ }
16947
170- /**
171- * 追加変更削除が行われた行を選択する。
172- */
173- private final TableModelListener tableModelListener = new TableModelListener() {
174- @Override
175- public void tableChanged(TableModelEvent event) {
176-
177- switch (event.getType()) {
178- case TableModelEvent.UPDATE:
179- int updateRow = convertRowIndexToView(event.getFirstRow());
180- changeSelection(updateRow, updateRow, false, false);
181- break;
48+ /**
49+ * @param dm
50+ */
51+ public JmyTable(TableModel dm) {
52+ super(dm);
53+ initialize();
54+ }
18255
183- case TableModelEvent.INSERT:
184- final int insertRow = event.getFirstRow();
185- // モデルの変更後に、追加行のGUI表示が行われる為、ここで追加イベントを拾ってもまだ画面表示は行われていない。
186- // なので、EDTにキューイング?して、画面書き換え後に選択させる。
187- SwingUtilities.invokeLater(new Runnable() {
188- @Override
189- public void run() {
190- // 行追加後のview状態で、view座標に変換。反映前だと変換テーブルがみつからないらしい
191- int row = convertRowIndexToView(insertRow);
192- changeSelection(row, row, false, false);
193- }
194- });
195- break;
196-
197- case TableModelEvent.DELETE:
198- if (getModel().getRowCount() == 0) {
199- break;
200- }
56+ /**
57+ * @param dm
58+ * @param cm
59+ */
60+ public JmyTable(TableModel dm, TableColumnModel cm) {
61+ super(dm, cm);
62+ initialize();
63+ }
20164
202- // 行削除前のview状態で、view座標に変換。反映後だと変換テーブルが見つからないらしい
203- final int deletedViewRow = convertRowIndexToView(event.getFirstRow());
204- SwingUtilities.invokeLater(new Runnable() {
65+ /**
66+ * @param numRows
67+ * @param numColumns
68+ */
69+ public JmyTable(int numRows, int numColumns) {
70+ super(numRows, numColumns);
71+ initialize();
72+ }
20573
206- @Override
207- public void run() {
208- int row = deletedViewRow;
209- if (getRowSorter().getViewRowCount() <= row) {
210- row = getRowSorter().getViewRowCount() - 1;
211- }
212- changeSelection(row, row, false, false);
213- }
214- });
215- break;
74+ /**
75+ * @param rowData
76+ * @param columnNames
77+ */
78+ public JmyTable(Vector<?> rowData, Vector<?> columnNames) {
79+ super(rowData, columnNames);
80+ initialize();
81+ }
21682
217- default:
218- break;
219- }
220- }
221- };
83+ /**
84+ * @param rowData
85+ * @param columnNames
86+ */
87+ public JmyTable(Object[][] rowData, Object[] columnNames) {
88+ super(rowData, columnNames);
89+ initialize();
90+ }
91+
92+ /**
93+ * @param dm
94+ * @param cm
95+ * @param sm
96+ */
97+ public JmyTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) {
98+ super(dm, cm, sm);
99+ initialize();
100+ }
101+
102+ private void initialize() {
103+ setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
104+ setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
105+ setShowVerticalLines(false);
106+ setShowHorizontalLines(false);
107+ setHighlighters(HighlighterFactory.createSimpleStriping());
108+ // setCellSelectionEnabled(true);
109+ setRowSelectionAllowed(true);
110+ setAutoCreateRowSorter(true);
111+ setEditable(false);
112+ new FontZoomByMouseWheel(this);
113+ }
114+
115+ @Override
116+ public void setModel(TableModel tableModel) {
117+ super.setModel(tableModel);
118+ new TableColumnFit(this).setEnableAutoFit(true);
119+ TableRowFilterSupport.forTable(this).searchable(true).apply();
120+ tableModel.addTableModelListener(tableModelListener);
121+ setSortsOnUpdates(true);
122+ }
123+
124+ /**
125+ * @return
126+ */
127+ public int getSelectedModelRow() {
128+ int row = getSelectedRow();
129+ if (row < 0) {
130+ return -1;
131+ }
132+ return convertRowIndexToModel(row);
133+ }
134+
135+ /**
136+ * @return
137+ */
138+ public int getSelectedModelColumn() {
139+ int column = getSelectedColumn();
140+ if (column < 0) {
141+ return -1;
142+ }
143+ return convertColumnIndexToModel(column);
144+ }
145+
146+ /**
147+ * @return
148+ */
149+ public ArrayList<Integer> getSelectedModelRows() {
150+ int[] rows = getSelectedRows();
151+ ArrayList<Integer> list = new ArrayList<Integer>(rows.length);
152+ for (int i = 0; i < rows.length; i++) {
153+ list.add(convertRowIndexToModel(rows[i]));
154+ }
155+ return list;
156+ }
157+
158+ /**
159+ * @return
160+ */
161+ public ArrayList<Integer> getSelectedModelColumns() {
162+ int[] columns = getSelectedColumns();
163+ ArrayList<Integer> list = new ArrayList<Integer>(columns.length);
164+ for (int i = 0; i < columns.length; i++) {
165+ list.add(convertColumnIndexToModel(columns[i]));
166+ }
167+ return list;
168+ }
169+
170+ /**
171+ * 追加変更削除が行われた行を選択する。
172+ */
173+ transient private final TableModelListener tableModelListener = new TableModelListener() {
174+ @Override
175+ public void tableChanged(TableModelEvent event) {
176+
177+ switch (event.getType()) {
178+ case TableModelEvent.UPDATE:
179+ int updateRow = convertRowIndexToView(event.getFirstRow());
180+ changeSelection(updateRow, updateRow, false, false);
181+ break;
182+
183+ case TableModelEvent.INSERT:
184+ final int insertRow = event.getFirstRow();
185+ // モデルの変更後に、追加行のGUI表示が行われる為、ここで追加イベントを拾ってもまだ画面表示は行われていない。
186+ // なので、EDTにキューイング?して、画面書き換え後に選択させる。
187+ SwingUtilities.invokeLater(new Runnable() {
188+ @Override
189+ public void run() {
190+ // 行追加後のview状態で、view座標に変換。反映前だと変換テーブルがみつからないらしい
191+ int row = convertRowIndexToView(insertRow);
192+ changeSelection(row, row, false, false);
193+ }
194+ });
195+ break;
196+
197+ case TableModelEvent.DELETE:
198+ if (getModel().getRowCount() == 0) {
199+ break;
200+ }
201+
202+ // 行削除前のview状態で、view座標に変換。反映後だと変換テーブルが見つからないらしい
203+ final int deletedViewRow = convertRowIndexToView(event.getFirstRow());
204+ SwingUtilities.invokeLater(new Runnable() {
205+
206+ @Override
207+ public void run() {
208+ int row = deletedViewRow;
209+ if (getRowSorter().getViewRowCount() <= row) {
210+ row = getRowSorter().getViewRowCount() - 1;
211+ }
212+ changeSelection(row, row, false, false);
213+ }
214+ });
215+ break;
216+
217+ default:
218+ break;
219+ }
220+ }
221+ };
222222
223223 }
diff -r 45db3cb8b39f -r b6558ad47c50 src/jdbcacsess2/main/TableColumnFit.java
--- a/src/jdbcacsess2/main/TableColumnFit.java Sat Mar 03 21:58:07 2012 +0900
+++ b/src/jdbcacsess2/main/TableColumnFit.java Sun Mar 04 12:13:41 2012 +0900
@@ -17,6 +17,8 @@
1717
1818 import java.awt.event.MouseEvent;
1919 import java.awt.event.MouseMotionListener;
20+import java.beans.PropertyChangeEvent;
21+import java.beans.PropertyChangeListener;
2022 import java.util.Enumeration;
2123
2224 import javax.swing.JComponent;
@@ -39,273 +41,293 @@
3941 * @author sima
4042 *
4143 */
42-public class TableColumnFit implements TableColumnModelListener, TableModelListener, MouseMotionListener {
43-
44- private final JTable jTable;
45- private boolean autoFit = false;
46-
47- public TableColumnFit(JTable jTable) {
48- this.jTable = jTable;
49- this.jTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
50- }
51-
52- /**
53- * カラム自動調整の実施可否状態
54- *
55- * @return autoFit
56- */
57- public boolean isAutoFit() {
58- return autoFit;
59- }
60-
61- /**
62- * カラム自動調整を中断または再開させる。EDTの中から実行してください。
63- *
64- * @param autoFit
65- * false の時は調整を中断する、trueの時は調整を実施する。初期値はtrue。
66- */
67- public void setEnableAutoFit(boolean autoFit) {
68- if (autoFit) {
69- // JTableの各column幅を、列の最大値幅に設定します。
70- // 最大幅は見出し/セルをフルスキャンする事で求めます。
71- setPreferredWidthFromHeader();
72- for (int row = 0; row < jTable.getModel().getRowCount(); row++) {
73- setPreferredWidthFromRoW(row);
74- }
75-
76- // 列幅変更したので画面表示を更新する。
77- jTable.doLayout();
78-
79- // 値が変わった時だけリスナー登録
80- if (this.autoFit != autoFit) {
81- JTableHeader jTableHeader = jTable.getTableHeader();
82- // Drag%Dropで列幅変更が行われた場合、自動調整を停止させたいので、
83- // Jtableヘッダーのマウスモーションを監視する。
84- if (jTableHeader != null) {
85- jTableHeader.addMouseMotionListener(this);
86- }
87-
88- // リアルタイムな行追加変更に応じて、列幅を変更したいので、
89- // テーブルモデルの値変更を監視する。
90- // 但し、テーブルモデルはabstractTableModelを実装し、fireXXXで変更を通知しなけらばならない。
91- jTable.getModel().addTableModelListener(this);
92- if (jTableHeader != null) {
93- jTableHeader.getColumnModel().addColumnModelListener(this);
94- }
95-
96- }
97- } else {
98- // 自動調整停止時は、監視リスナーを削除する。
99- jTable.getTableHeader().removeMouseMotionListener(this);
100- jTable.getModel().removeTableModelListener(this);
101- jTable.getTableHeader().getColumnModel().removeColumnModelListener(this);
102- }
103- this.autoFit = autoFit;
104- }
105-
106- /*
107- * (非 Javadoc)
108- *
109- * @see
110- * java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent
111- * )
112- */
113- @Override
114- public void mouseDragged(MouseEvent e) {
115- // 列ヘッダーのDrag&Dropが行われたら自動列幅調整は停止する。
116- setEnableAutoFit(false);
117- }
118-
119- /*
120- * (非 Javadoc)
121- *
122- * @see
123- * javax.swing.event.TableColumnModelListener#columnAdded(javax.swing.event
124- * .TableColumnModelEvent)
125- */
126- @Override
127- public void columnAdded(TableColumnModelEvent e) {
128- if (!autoFit) {
129- return;
130- }
131- setPreferredWidthFromHeader();
132- }
133-
134- /*
135- * (非 Javadoc)
136- *
137- * @seejavax.swing.event.TableModelListener#tableChanged(javax.swing.event.
138- * TableModelEvent)
139- */
140- @Override
141- public void tableChanged(TableModelEvent event) {
142- if (!autoFit) {
143- return;
144- }
145- switch (event.getType()) {
146- case TableModelEvent.UPDATE:
147-
148- if (event.getFirstRow() == TableModelEvent.HEADER_ROW) {
149- // AbstractTableModel#fireTableStructureChanged の時らしいが、
150- // DefaultTableColumnModel では、カラム数=0 で呼ばれる為、その時は意味の無い処理となる。
151- // 但し、JTable#setModel の時も呼ばれるがので、その時意味がある。
152- setPreferredWidthFromHeader();
153- } else {
154- int cnt = jTable.getModel().getRowCount();
155- if (event.getLastRow() < cnt) {
156- cnt = event.getLastRow();
157- }
158- for (int row = event.getFirstRow(); row < cnt; row++) {
159- setPreferredWidthFromRoW(row);
160- }
161- }
162- break;
163-
164- case TableModelEvent.INSERT:
165-
166- for (int row = event.getFirstRow(); row <= event.getLastRow(); row++) {
167- setPreferredWidthFromRoW(row);
168- }
169- break;
44+public class TableColumnFit implements TableColumnModelListener, TableModelListener, MouseMotionListener,
45+PropertyChangeListener {
17046
171- default:
172- break;
173- }
174- }
175-
176- /**
177- * JTableのヘッダcolumn内容でセル幅を設定します。
178- *
179- * @param jTable
180- * column幅を変更したいJTable
181- */
182- private void setPreferredWidthFromHeader() {
183- JTableHeader tableHeader = jTable.getTableHeader();
184- TableCellRenderer defrenderer = null;
185- if (tableHeader != null) {
186- defrenderer = tableHeader.getDefaultRenderer();
187- }
188- TableColumnModel tcm = jTable.getColumnModel();
189-
190- Enumeration<TableColumn> e = tcm.getColumns();
191- while (e.hasMoreElements()) {
192- TableColumn tableColumn = e.nextElement();
193-
194- TableCellRenderer r = tableColumn.getCellRenderer();
195- if (r == null) {
196- // 個別設定が無いのでデフォルトを使用する
197- if (defrenderer != null) {
198- r = defrenderer;
199- } else {
200- return;
201- }
202- }
203- JComponent c = (JComponent) r.getTableCellRendererComponent(jTable,
204- tableColumn.getHeaderValue(),
205- false,
206- false,
207- -1,
208- 0);
209- int w = preferredWidth(c);
210- tableColumn.setPreferredWidth(w);
211- }
212- }
213-
214- /**
215- * JTableの行column内容でセル幅を設定します。
216- *
217- * @param row
218- * columha幅を変更したい行
219- */
220- private void setPreferredWidthFromRoW(int row) {
221- for (int column = 0; column < jTable.getColumnCount(); column++) {
222- TableColumn tableColumn = jTable.getColumnModel().getColumn(column);
47+ private final JTable jTable;
48+ private boolean autoFit = false;
22349
224- TableCellRenderer r = jTable.getCellRenderer(row, column);
225- // cellの値を getValueAt で取得し、レンダラーにて表示後コンポーネントを作成する。
226- // 作成したコンポーネントは、勿体無いけど捨ててしまう。
227- // JTable#getValueAt は view座標指定なので、TableModel#getValueAt
228- // でモデル座標で取得する。
229- JComponent c = (JComponent) r.getTableCellRendererComponent(jTable,
230- jTable.getModel().getValueAt(row, column),
231- false,
232- false,
233- row,
234- column);
235- int w = preferredWidth(c);
236- if (tableColumn.getPreferredWidth() < w) {
237- tableColumn.setPreferredWidth(w);
238- }
239- }
240- }
241-
242- /**
243- * セルコンポーネントの幅を計算する
244- *
245- * @param jComponent
246- * セルコンポーネント
247- * @return セルコンポーネントの幅に余白幅を加算した値
248- */
249- private int preferredWidth(JComponent jComponent) {
250- int rtn = jComponent.getPreferredSize().width + jComponent.getInsets().left + jComponent.getInsets().right
251- + jTable.getIntercellSpacing().width;
252- return rtn;
253- }
254-
255-
256- /*
257- * (非 Javadoc)
258- *
259- * @see
260- * java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)
261- */
262- @Override
263- public void mouseMoved(MouseEvent e) {
264- }
50+ public TableColumnFit(JTable jTable) {
51+ this.jTable = jTable;
52+ this.jTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
53+ }
26554
266- /*
267- * (非 Javadoc)
268- *
269- * @see
270- * javax.swing.event.TableColumnModelListener#columnMarginChanged(javax.
271- * swing.event.ChangeEvent)
272- */
273- @Override
274- public void columnMarginChanged(ChangeEvent e) {
275- }
55+ /**
56+ * カラム自動調整の実施可否状態
57+ *
58+ * @return autoFit
59+ */
60+ public boolean isAutoFit() {
61+ return autoFit;
62+ }
27663
277- /*
278- * (非 Javadoc)
279- *
280- * @see
281- * javax.swing.event.TableColumnModelListener#columnMoved(javax.swing.event
282- * .TableColumnModelEvent)
283- */
284- @Override
285- public void columnMoved(TableColumnModelEvent e) {
286- }
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+ }
28778
288- /*
289- * (非 Javadoc)
290- *
291- * @see
292- * javax.swing.event.TableColumnModelListener#columnRemoved(javax.swing.
293- * event.TableColumnModelEvent)
294- */
295- @Override
296- public void columnRemoved(TableColumnModelEvent e) {
297- }
79+ // 列幅変更したので画面表示を更新する。
80+ jTable.doLayout();
29881
299- /*
300- * (非 Javadoc)
301- *
302- * @see
303- * javax.swing.event.TableColumnModelListener#columnSelectionChanged(javax
304- * .swing.event.ListSelectionEvent)
305- */
306- @Override
307- public void columnSelectionChanged(ListSelectionEvent e) {
308- }
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+ }
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+ }
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+ }
248+
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+ Jdbcacsess2.logger.fine(evt.getPropertyName());
271+
272+ setPreferredWidthFromHeader();
273+ for (int row = 0; row < jTable.getModel().getRowCount(); row++) {
274+ setPreferredWidthFromRoW(row);
275+ }
276+ }
277+
278+ /*
279+ * (非 Javadoc)
280+ *
281+ * @see
282+ * java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)
283+ */
284+ @Override
285+ public void mouseMoved(MouseEvent e) {
286+ }
287+
288+ /*
289+ * (非 Javadoc)
290+ *
291+ * @see
292+ * javax.swing.event.TableColumnModelListener#columnMarginChanged(javax.
293+ * swing.event.ChangeEvent)
294+ */
295+ @Override
296+ public void columnMarginChanged(ChangeEvent e) {
297+ }
298+
299+ /*
300+ * (非 Javadoc)
301+ *
302+ * @see
303+ * javax.swing.event.TableColumnModelListener#columnMoved(javax.swing.event
304+ * .TableColumnModelEvent)
305+ */
306+ @Override
307+ public void columnMoved(TableColumnModelEvent e) {
308+ }
309+
310+ /*
311+ * (非 Javadoc)
312+ *
313+ * @see
314+ * javax.swing.event.TableColumnModelListener#columnRemoved(javax.swing.
315+ * event.TableColumnModelEvent)
316+ */
317+ @Override
318+ public void columnRemoved(TableColumnModelEvent e) {
319+ }
320+
321+ /*
322+ * (非 Javadoc)
323+ *
324+ * @see
325+ * javax.swing.event.TableColumnModelListener#columnSelectionChanged(javax
326+ * .swing.event.ListSelectionEvent)
327+ */
328+ @Override
329+ public void columnSelectionChanged(ListSelectionEvent e) {
330+ }
309331
310332
311333 }
Show on old repository browser