- ベストアンサー
Swing/JTableのカラム幅の変更について
お世話になります。ついこの前にも質問したのですが、 さらにわからないことがでてきたので質問させていただきます。 AUTO_RESIZE_OFFにしておいてユーザーがテーブルのカラム幅を変更した際や最大化/元に戻す(縮小)した際、セットされているJScrollPaneのViewportがあまっていたら最後の行で調節する(AUTO_RESIZE_LAST_COLUMN相当)ということをしたいのです AUTO_RESIZE_LAST_COLUMNにしないのは最大化/縮小のときにはカラム幅を変更しないためです。 以下のようなコードを組んだのですが幅を変更した際には微妙にずれてしまいます。 また、最大化はできるのですが、縮小するとうまくいきません。 よろしくお願いします。 ****** for(int i=0;i<8;i++){//列は8列です table.getColumnModel().getColumn(i).addPropertyChangeListener(new PropertyChangeListener(){ public void propertyChange(PropertyChangeEvent e) { if (e.getPropertyName().equals("width")) { adjustOnLastColumn(); } } });} jScrollPane1.addComponentListener(new ComponentAdapter(){ @Override public void componentResized(ComponentEvent e){ adjustOnLastColumn(); } }); public void adjustOnLastColumn(){ int widthSum = 0; for(int i = 0;i<8;i++){ widthSum += table.getColumnModel().getColumn(i).getWidth(); } table.getColumnModel().getColumn(8).setMaxWidth( jScrollPane1.getViewport().getSize().width - widthSum); table.getColumnModel().getColumn(8).setMinWidth( jScrollPane1.getViewport().getSize().width - widthSum); }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
質問の意味(なにをやりたいのか)が、いまいちよく分かりませんが、こういうことでしょうか?。 ---------------------------------------------------- import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.beans.*; public class TableColumnWidth{ JFrame frame; JTable table; JScrollPane jsp; public TableColumnWidth(){ frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); table = new JTable(10, 8); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); jsp = new JScrollPane(table); frame.getContentPane().add(jsp, BorderLayout.CENTER); frame.pack(); frame.setVisible(true); for(int i = 0; i < 8; i++){//列は8列です table.getColumnModel().getColumn(i).addPropertyChangeListener (new PropertyChangeListener(){ public void propertyChange(PropertyChangeEvent e) { if (e.getPropertyName().equals("width")) { adjustOnLastColumn(); } } }); } jsp.addComponentListener(new ComponentAdapter(){ @Override public void componentResized(ComponentEvent e){ adjustOnLastColumn(); } }); } public void adjustOnLastColumn(){ int widthSum = 0; for (int i = 0; i < 7; i++){ widthSum += table.getColumnModel().getColumn(i).getWidth(); } table.getColumnModel().getColumn(7).setPreferredWidth (jsp.getViewport().getSize().width - widthSum); table.getColumnModel().getColumn(7).setMaxWidth (jsp.getViewport().getSize().width - widthSum); table.getColumnModel().getColumn(7).setMinWidth (jsp.getViewport().getSize().width - widthSum); table.getColumnModel().getColumn(7).setMinWidth (jsp.getViewport().getSize().width - widthSum); } public static void main(String[] args){ new TableColumnWidth(); } } ---------------------------------------------------
その他の回答 (3)
- _ranco_
- ベストアンサー率58% (126/214)
(追加) 最後の行はもちろん、setWidth()ですね。
お礼
お礼が遅くなってすみません おかげでうまく実装することができました ありがとうございました
- _ranco_
- ベストアンサー率58% (126/214)
> なぜsetMinWidthを2度しないといけないのでしょうか あちゃー!、ごめんなさい。単にエディタの操作ミスです。
- HarukaV49
- ベストアンサー率53% (48/89)
>table.getColumnModel().getColumn(8).setMaxWidth( >jScrollPane1.getViewport().getSize().width - widthSum); >table.getColumnModel().getColumn(8).setMinWidth( >jScrollPane1.getViewport().getSize().width - widthSum); この部分を int fixedWidth = jScrollPane1.getViewport().getSize().width - widthSum; table.getColumnModel().getColumn(8).setMaxWidth( fixedWidth ); table.getColumnModel().getColumn(8).setMinWidth( fixedWidth ); table.getColumnModel().getColumn(8).setPreferredWidth( fixedWidth ); table.getColumnModel().getColumn(8).setWidth( fixedWidth ); に置換して動作を確認してみてください。 setMinWidth(a),setMaxWidth(b)の動作は、設定後にsetWidth(c)が実行されたとき 実際の幅を a<=c<=bならばcに, c<aならばaに, c>bならばbに 設定しようとします。 現行のソースでは、setWidth()が実行された後に制約(setMinWidth(),setMinWidth())が 追加される形になっているために、その反映が次回に遅れてしまっています。
お礼
その通りにしたらできました。ありがとうございます setWidthはAPIを見ても使用しないでくださいと記載されていますし、 単体で用いても幅を設定することができません それでもこの場合は有効なんですね 勉強になりました。回答ありがとうございました
お礼
言葉が足りず、申し訳ありません 実際は8列+調整用1列で、9列目で調整しようとしているんです ご提示された方法でうまくいくのですが、なぜsetMinWidthを2度しないといけないのでしょうか よろしければご教授ください 普通に行けば一回でかまわないと思うのですが・・・