如何更改表的列宽

时间:2010-04-08 13:49:01

标签: java swing jtable

对于以下代码,我无法将列大小设置为自定义大小。为什么会这样?还没有显示第一列。

    import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.TableColumn;

public class Trial extends JFrame{
   public void create(){
     JPanel jp = new JPanel();
     String[] string = {" ", "A"};
     Object[][] data = {{"A", "0"},{"B", "3"},{"C","5"},{"D","-"}};
     JTable table = new JTable(data, string);     
     jp.setLayout(new GridLayout(2,0));   
     jp.add(table);

     table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
     TableColumn column = null;
     for (int i = 0; i < 2; i++) {
        column = table.getColumnModel().getColumn(i);
        column.setPreferredWidth(20);      //custom size
       }
     setLayout(new BorderLayout());
     add(jp);
   }

   public static void main(String [] a){
      Trial trial = new Trial();
      trial.setSize(300,300);
      trial.setVisible(true);
      trial.setDefaultCloseOperation(Trial.EXIT_ON_CLOSE);
      trial.create();
   }
}

2 个答案:

答案 0 :(得分:3)

你在这里遇到了几个问题。首先,始终从Swing EDT初始化您的JFrame:

   public static void main(String[] a) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            Trial trial = new Trial();
            trial.setSize(300, 300);
            trial.setDefaultCloseOperation(Trial.EXIT_ON_CLOSE);
            trial.create();
         }
      });
   }

如果不这样做会导致细微的错误。第二:JTable喜欢存在于JScrollPanes中。这就是你没有看到列标题的原因:

  JScrollPane pane = new JScrollPane();
  pane.setViewportView(table);
  jp.add(pane);

完成上述操作后,我会看到每个20像素宽的小小柱。

答案 1 :(得分:2)

当自动调整大小模式设置为关闭时,在布置表格时,根本不会调整列宽。来自JTable的doLayout()文档:

  

AUTO_RESIZE_OFF:不自动   根本调整列的宽度。使用   一个水平滚动条,以容纳   当它们的总和超过时的列   视口的宽度。 如果是JTable   没有包含在JScrollPane中   可能会留下部分表格   不可见的。

尝试将JTable添加到JScrollPane,然后将其添加到面板。