【问题标题】:about column's width of a JTable in a JScrollPane关于 JScrollPane 中 JTable 的列宽
【发布时间】:2010-08-10 10:35:38
【问题描述】:

我想在 JScrollPane 中为 JTable 的每一列设置一个固定的 num 宽度,但我无法使用 infoTable.getColumnModel().getColumn(0).setPreferredWidth(10); 我使用 JScrollPane 的默认布局并在 j2se 1.4 中添加带有 scrollPane 的 setViewPortView(infoTable) 的表。 我怎样才能做到这一点? 这是我的代码

private javax.swing.JButton jButton1;
private javax.swing.JScrollPane jScrollPane1;
public TableFrame() {

    jScrollPane1 = new javax.swing.JScrollPane();
    jButton1 = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jScrollPane1.setBorder(javax.swing.BorderFactory.createLineBorder(
        new java.awt.Color(0, 0, 0)));

    jButton1.setText("jButton1");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });

    this.setSize(new Dimension(600, 600));
    this.jScrollPane1.setSize(500, 500);
    this.getContentPane().add(this.jScrollPane1, BorderLayout.CENTER);
    this.getContentPane().add(this.jButton1, BorderLayout.WEST);
    table = new JTable(new javax.swing.table.DefaultTableModel(100, 2));
    this.jScrollPane1.setViewportView(table);
    table.getColumnModel().getColumn(0).setWidth(10);
}

ps。谢谢回复 我需要可以拖动列来调整大小,所以我无法设置最大和最小大小

【问题讨论】:

    标签: java swing jtable jscrollpane jtableheader


    【解决方案1】:

    还设置列的最小和最大宽度与 setPreferredWidth 设置相同。

    infoTable.getColumnModel().getColumn(0).setMinWidth(10);
    infoTable.getColumnModel().getColumn(0).setMaxWidth(10);
    infoTable.getColumnModel().getColumn(0).setPreferredWidth(10);
    

    【讨论】:

      【解决方案2】:

      一般您只需要设置首选宽度即可。但要实现您的目标,您首先需要了解默认宽度以及如何使用它们来确定实际的默认尺寸:

      min = 15  
      preferred = 75  
      max = Integer.MAX_VALUE
      

      所以你不能使用 10,除非你也改变了最小宽度。

      让我们举一个简单的例子,第 1 列的首选宽度为 25,滚动窗格为 500。因此,两列的首选宽度为 100 (25 + 75)。额外的 400 像素平均分配在两列之间,因此列将显示为 225 (25 + 200) 和 275 (75 + 200)。因此,默认情况下,您不能只以 25 像素显示第一列,除非您还将第二列设置为 475。

      如果您希望所有列都以其首选宽度显示,那么您需要使用:

      table.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
      

      【讨论】:

        【解决方案3】:

        注意setWidth()“不应用于设置JTable中列的宽度,请改用setPreferredWidth()。”此外,避免多个相互冲突的约束。太多会混淆你的意图。通常,单个setPreferredSize() 就足够了,如下所示。

        请注意为了强调而更改了一些功能。

        import java.awt.*;
        import java.awt.event.*;
        import javax.swing.*;
        import javax.swing.table.*;
        
        /** @see http://stackoverflow.com/questions/3448030 */
        public class TablePanel extends JPanel {
        
            private JButton button = new JButton("Button");
            private JTable table = new JTable(new DefaultTableModel(100, 2));
            private javax.swing.JScrollPane jsp = new JScrollPane(table);
        
            public TablePanel() {
                super(new BorderLayout());
                button.addActionListener(new ActionListener() {
        
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        System.out.println(e);
                    }
                });
                JPanel panel = new JPanel();
                panel.add(button);
                this.add(panel, BorderLayout.WEST);
        
                jsp.setBorder(BorderFactory.createLineBorder(Color.red));
                jsp.getViewport().setPreferredSize(new Dimension(500, 500));
                this.add(jsp, BorderLayout.CENTER);
                table.getColumnModel().getColumn(0).setPreferredWidth(6);
                table.setGridColor(Color.gray);
            }
        
            private void display() {
                JFrame f = new JFrame("TablePanel");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.add(this);
                f.pack();
                f.setLocationRelativeTo(null);
                f.setVisible(true);
            }
        
            public static void main(String[] args) {
                EventQueue.invokeLater(new Runnable() {
        
                    @Override
                    public void run() {
                        new TablePanel().display();
                    }
                });
            }
        }
        

        【讨论】:

        【解决方案4】:

        用途:

        setWidth(int i) 
        

        结合:

        setMaxWidth(int i)
        setMinWidth(int i)
        

        仅在您想为列设置固定宽度并希望即使表格改变大小或位置时也保持不变的情况下使用此选项。

        setPreferredWidth(10) 只是对布局管理器的建议。

        【讨论】:

        • 我无法设置最大宽度或最小宽度,因为我想允许用户拖动以调整大小。但是,我无法使用 setWidth 来完成它,该列自动调整大小。
        • 所以您确实希望布局管理器能够调整表格大小,而不是设置列的最小/最大宽度并在最小/最大范围内为其提供首选尺寸
        【解决方案5】:

        正如其他贡献者所说,您必须设置首选、最小和最大宽度。在这里您可以找到一个示例,其中第 0 列增长,第 1 列具有固定宽度:

        table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        final int COLUMN_0_WIDTH = 650;
        final int COLUMN_1_WIDTH = 200;
        table.getColumnModel().getColumn(0).setPreferredWidth(COLUMN_0_WIDTH);
        table.getColumnModel().getColumn(0).setMinWidth(COLUMN_0_WIDTH);
        table.getColumnModel().getColumn(0).setMaxWidth(COLUMN_0_WIDTH*3);
        
        table.getColumnModel().getColumn(1).setPreferredWidth(COLUMN_1_WIDTH);
        table.getColumnModel().getColumn(1).setMinWidth(COLUMN_1_WIDTH);
        table.getColumnModel().getColumn(1).setMaxWidth(COLUMN_1_WIDTH);
        

        【讨论】:

          猜你喜欢
          • 2014-01-21
          • 2011-05-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-19
          • 2015-03-27
          • 1970-01-01
          相关资源
          最近更新 更多