• ベストアンサー

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); }

質問者が選んだベストアンサー

  • ベストアンサー
  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.2

質問の意味(なにをやりたいのか)が、いまいちよく分かりませんが、こういうことでしょうか?。 ---------------------------------------------------- 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();  } } ---------------------------------------------------

foggi47
質問者

お礼

言葉が足りず、申し訳ありません 実際は8列+調整用1列で、9列目で調整しようとしているんです ご提示された方法でうまくいくのですが、なぜsetMinWidthを2度しないといけないのでしょうか よろしければご教授ください 普通に行けば一回でかまわないと思うのですが・・・

その他の回答 (3)

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.4

(追加) 最後の行はもちろん、setWidth()ですね。

foggi47
質問者

お礼

お礼が遅くなってすみません おかげでうまく実装することができました ありがとうございました

  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.3

> なぜsetMinWidthを2度しないといけないのでしょうか あちゃー!、ごめんなさい。単にエディタの操作ミスです。

  • HarukaV49
  • ベストアンサー率53% (48/89)
回答No.1

>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())が 追加される形になっているために、その反映が次回に遅れてしまっています。

foggi47
質問者

お礼

その通りにしたらできました。ありがとうございます setWidthはAPIを見ても使用しないでくださいと記載されていますし、 単体で用いても幅を設定することができません それでもこの場合は有効なんですね 勉強になりました。回答ありがとうございました

関連するQ&A

専門家に質問してみよう