ちくのう症(蓄膿症)は「菌」が原因!?

お世話になります。ついこの前にも質問したのですが、
さらにわからないことがでてきたので質問させていただきます。

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

このQ&Aに関連する最新のQ&A

A 回答 (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();
 }
}
---------------------------------------------------
    • good
    • 0
この回答へのお礼

言葉が足りず、申し訳ありません
実際は8列+調整用1列で、9列目で調整しようとしているんです

ご提示された方法でうまくいくのですが、なぜsetMinWidthを2度しないといけないのでしょうか
よろしければご教授ください
普通に行けば一回でかまわないと思うのですが・・・

お礼日時:2008/05/06 18:11

(追加)


最後の行はもちろん、setWidth()ですね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/05/16 20:02

> なぜsetMinWidthを2度しないといけないのでしょうか


あちゃー!、ごめんなさい。単にエディタの操作ミスです。
    • good
    • 0

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

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

お礼日時:2008/05/06 18:06

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング