`
hcx_2008
  • 浏览: 122115 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Swing表格列宽自适应

    博客分类:
  • J2SE
阅读更多
Swing表格列宽自适应


从别人分享的代码中得到了一些启发。
1.要想实现JTable宽度自适应,必须首先调用setAutoResizeMode方法,将JTable的自适应模适修改为JTable.AUTO_RESIZE_OFF,默认为JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS。
在设置此方法前,需要先比较如果表格当前的实际大小并没有达到父容器的宽度,则将其设置为AUTO_RESIZE_SUBSEQUENT_COLUMNS使表格充满父容器,这样更好看些。如果超过了父容器的宽度,则设置为JTable.AUTO_RESIZE_OFF,用自已实际计算的宽度进行设置。因些,在这儿需要比较表格的实际大小与父容器的实际大小再进行设置。
2.宽度自适应需要考虑到表头和表格列数据的实际宽度,对每一列的实际宽度做比较,包括表头,取其中最大值,并设置其值为比较后的最大值。注意,需要调用table().getColumnModel().getColumn(j).setPreferredWidth(max)而不是setWidth方法。
3.一般我们在程序使用过程中都会把JTable加到一个JScrollPane中,以便使JTable实现滚动功能。因此,当我们要达到自适应时,将表格自适应属性设置为JTable.AUTO_RESIZE_OFF后,需要为父容器填加ComponentListener,并实现componentResized方法,在该方法中对表格的宽度进行自适应设置。
4.具体代码如下:

//表格
JTable table=new JTable();
//表格要增加的滚动面板
JScrollPane scrollPane=new JScrollPane(table);

//为滚动面板添加ComponentListener
tablePanel.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                resizeTable(true);
            }
});
//表格自适应方法,需要在表格初始化后,父容器大小发生变化后以及表格模型修改后调用
public void resizeTable(boolean bool) {
        Dimension containerwidth = null;
        if (!bool) {
            //初始化时,父容器大小为首选大小,实际大小为0
            containerwidth = scrollPane.getPreferredSize();
        } else {
            //界面显示后,如果父容器大小改变,使用实际大小而不是首选大小
            containerwidth = scrollPane.getSize();
        }
        //计算表格总体宽度
        int allwidth = getTable().getIntercellSpacing().width;
        for (int j = 0; j < getTable().getColumnCount(); j++) {
            //计算该列中最长的宽度
            int max = 0;
            for (int i = 0; i < getTable().getRowCount(); i++) {
                int width = getTable().
                  getCellRenderer(i, j).getTableCellRendererComponent
                  (getTable(), getTable().getValueAt(i, j), false,
                  false, i, j).getPreferredSize().width;
                if (width > max) {
                    max = width;
                }
            }
            //计算表头的宽度
            int headerwidth = getTable().
              getTableHeader().
              getDefaultRenderer().getTableCellRendererComponent(
              getTable(), getTable().getColumnModel().
              getColumn(j).getIdentifier(), false, false,
              -1, j).getPreferredSize().width;
            //列宽至少应为列头宽度
            max += headerwidth;
            //设置列宽
            getTable().getColumnModel().
              getColumn(j).setPreferredWidth(max);
            //给表格的整体宽度赋值,记得要加上单元格之间的线条宽度1个像素
            allwidth += max + getTable().getIntercellSpacing().width;
        }
        allwidth += getTable().getIntercellSpacing().width;
        //如果表格实际宽度大小父容器的宽度,则需要我们手动适应;否则让表格自适应
        if (allwidth > containerwidth.width) {
            getTable().setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        } else {
            getTable().
              setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
        }
}
分享到:
评论

相关推荐

    基于JTable的列宽与内容自适应的实现方法

    在Java Swing中,`JTable`是一个非常常用的组件,用于展示二维数据表格。然而,默认情况下,`JTable`的列宽是平均分配的,这可能导致某些含有长内容的单元格被截断,影响了用户体验。为了解决这个问题,我们可以实现...

    java 读取数据库mysql千余条微博excel数据,并用swing界面显示结果

    3. 自定义表格列:可以通过重写`DefaultTableModel`的方法来调整列的显示方式,如数据格式化、列宽自适应等。 4. 布局管理:使用`GridBagLayout`或`BoxLayout`等布局管理器,合理安排GUI组件的位置。 5. 添加事件...

    Java Swing GridBagLayout网格袋布局的实现

    3. weightx和weighty:如何分布额外空间(单元格区域外,容器边缘内的间隔),当指定行/列中的其中一个组件的权重(大于0),则该行/列将(和其他行/列按权重比例)分配额外的水平/竖直空间。 4. fill:组件在其显示...

    JGoodies FormLayout

    1. **基于表格的布局**:FormLayout 使用表格来组织组件,每一行和每一列都可以有固定的间距或者根据内容自适应。这种布局方式使得开发者可以轻松地创建网格状的用户界面,每个单元格可以包含一个或多个组件。 2. *...

    TableLayout.zip

    1. **行列定义**:开发者可以预先定义表格的行数和列数,以及每一行和每一列的大小策略。大小策略可以是固定值,也可以是相对于容器大小的百分比。 2. **对齐方式**:TableLayout支持组件的水平和垂直对齐方式,如...

    Java中JTable的用法

    JTable是Swing框架中用于显示和编辑表格数据的关键组件之一。它不仅提供了强大的数据管理功能,还支持丰富的定制选项,使得开发者能够根据具体需求创建出高度个性化的表格界面。 #### 二、JTable基本用法 1. **...

    Java的小技巧(很小的)

    如果表格列数较多,可能会导致表格宽度超过窗口宽度,此时可以使用以下方法解决: ```java jTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); ``` 通过将`autoResizeMode`属性设置为`AUTO_RESIZE_OFF`,可以让...

    swt-demo.zip

    3. 自适应布局:应用可以根据屏幕尺寸和设置的行数、列数自动调整布局。这通常通过SWT的布局管理器实现,如GridLayout或FillLayout,它们能够帮助控件适应容器的大小变化。 4. 滚动条:当图片列表超出视口范围时,...

    swt form

    TableLayout与其他布局管理器(如GridLayout、FillLayout、RowLayout等)相比,提供了更复杂和灵活的布局可能性,比如可以设置列宽的自适应或者固定,也可以设置控件在特定列或行中的对齐方式。 在实际应用中,...

    设置多行显示与滚动条.rar

    这通常发生在文本框、列表或表格等元素中。为了实现这一功能,开发者需要选择合适的布局策略,例如使用网格布局或流式布局,并根据内容自动调整大小。 滚动条则是用于查看超出可视区域的内容的工具。它通常出现在...

    调整控件大小2.rar

    - 在编程环境中,如Java的Swing或Android Studio,可以通过修改控件的属性,如`width`和`height`,来调整大小。例如,在XML布局文件中设置`android:layout_width`和`android:layout_height`。 - 对于Web开发,HTML...

Global site tag (gtag.js) - Google Analytics