【问题标题】:JTable set column size problemJTable设置列大小问题
【发布时间】:2011-04-25 05:48:41
【问题描述】:

我在设置 JTable 的列宽时遇到了这个问题。

下面的代码可以正常工作:

TableColumn a =shipsAndOwnHitsTable.getColumnModel().getColumn(0);
a.setPreferredWidth(800);

它改变了第一列的宽度。

但是,当放置在 while 或 for 循环中时,什么也没有发生:

        int index = 0;
        while (index < columnNum){
            TableColumn a =shipsAndOwnHitsTable.getColumnModel().getColumn(index);
            a.setPreferredWidth(800);
            index+=1;
        }

此代码不起作用,列大小没有任何变化,有人可以解释原因吗? 如果不能,有人可以告诉我如何将行宽和列宽设置为相同,即我希望表格中的所有单元格都是方形的,无论表格大小(行和列)如何。?

谢谢

【问题讨论】:

  • 你确定 columnNum>0 吗?
  • 很抱歉,我不得不问一个显而易见的问题:你在你的桌子上打电话给setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 吗?周围的布局是否允许任意表格大小? (尝试将其放入JScrollPane
  • @Howard:没关系,我已经完成了 setAutoResizeMode(JTable.AUTO_RESIZE_OFF);我会试试 JScrollPane。
  • 您必须发布SSCCE。如果这一切都实现了,它应该可以完美地工作。

标签: java swing jtable


【解决方案1】:

以下代码可以正常工作。根据我的cmets,请注意

  • setAutoResizeMode(JTable.AUTO_RESIZE_OFF) 被调用
  • 表格组件嵌入到JScrollPane 中以允许任意大小

将其与您的代码进行比较,您可能很快就会发现您的问题。

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.TableColumn;

public class TableColumnSizeTest {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame f = new JFrame();
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

                // prepare table
                JTable table = new JTable(new String[][] {  
                                 { "Row 1 Col A", "Row 1 Col B" }, 
                                 { "Row 2 Col A", "Row 2 Col B" } }, 
                                 new String[] { "ColA", "ColB" });

                // add into scroll pane
                f.getContentPane().add(new JScrollPane(table));

                // turn off auto resize
                table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

                // set preferred column widths
                int index = 0;
                while (index < 2) {
                    TableColumn a = table.getColumnModel().getColumn(index);
                    a.setPreferredWidth(10);
                    index++;
                }

                f.pack();

                f.setVisible(true);
            }
        });
    }
}

【讨论】:

  • 谢谢!它现在可以工作,但我实际上不需要 JScrollPane,有没有办法让它在没有 JScrollPane 的情况下工作?
  • @Saher 例如你可以使用FlowLayout
  • 谢谢霍华德。我将我的 TableLayout 大小更改为 FILL 而不是 PreferredSize 并且效果很好。
  • 啊哈,我不知道这个setAutoResizeMode,这对我来说是新事物:-)
【解决方案2】:

尝试将最小和最大宽度也设置为800。和其他宽度,如果你能找到的话。

【讨论】:

    【解决方案3】:

    我相信列宽是相对的。所有 800 应该与所有 100 相同,但请尝试将它们设置为不同的值。要使它们都变大,请将桌子本身变宽。

    【讨论】:

      【解决方案4】:

      为什么不使用:

       int index = 0;
      
          while (index < columnNum){
              shipsAndOwnHitsTable.getColumnModel().getColumn(index).setPreferredWidth(800);
              index+=1;
          }
      

      为什么不把你的循环改成:

      for(int index = 0; index < columnNum; index++){
         shipsAndOwnHitsTable.getColumnModel().getColumn(index).setPreferredWidth(800);// two lines of code less
      }
      

      如果您事先不知道迭代次数,请记住使用(推荐)while-loop...

      【讨论】:

        【解决方案5】:

        如果 jTable 在 jScrollPane 中,您还需要增加 jScrollPane 的大小(宽度)...

        示例代码,

        
                int index = 0;
                int columnNum = 2;
                while (index < columnNum){
                 TableColumn a=jTable1.getColumnModel().getColumn(index);
        Dimension d = jTable1.getPreferredSize(); d.width = d.width + 500; jTable1.setPreferredSize(d); jScrollPane1.setPreferredSize(d); index+=1; }
        我使用了现有表格的大小并增加了窗格的大小......

        希望这会有所帮助...

        【讨论】:

        • 我实际上没有scrollPane。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-14
        • 1970-01-01
        • 2011-09-08
        • 1970-01-01
        • 2014-09-06
        • 2011-02-14
        • 1970-01-01
        相关资源
        最近更新 更多