计算JTable的最宽列

时间:2016-04-07 12:09:57

标签: java mysql swing jtable autoresize

我有一个JTable对象,显示预先选择的MySQL表的所有内容。正如您所知,这个类提供了诸如列自动调整大小之类的功能:我想创建一个过程来计算表中包含的所有单元格的宽度之和,如果结果是次要的,则打开AUTO RESIZE模式而不是preferredWidth。我一直试图关注数百个在线指南,但我的程序仍然无效:

public void setTableColumnPreferredWidth(javax.swing.JTable aTable)
{
    int width = 0;
    int TotalWidth = 0;
    for (int row = 0; row < aTable.getRowCount(); row++)
    {
        for (int myColumn=0;myColumn < aTable.getColumnCount();myColumn++)
        {
            TableCellRenderer renderer = aTable.getCellRenderer(row, myColumn);
            Component comp = aTable.prepareRenderer(renderer, row, myColumn);
            width = Math.max (comp.getPreferredSize().width, width);
            aTable.getColumnModel().getColumn(myColumn).setPreferredWidth(width);
        }
    }

    for (int I=0;I<aTable.getColumnModel().getColumnCount();I++)
        TotalWidth += aTable.getColumnModel().getColumn(I).getPreferredWidth();

    int maximum = 0;

    if (MainTable.getAutoResizeMode() == MainTable.AUTO_RESIZE_ALL_COLUMNS)
        maximum = MainTable.getPreferredSize().width;
    else
    {
        int PreviousAutoresize = MainTable.getAutoResizeMode();
        MainTable.setAutoResizeMode(MainTable.AUTO_RESIZE_ALL_COLUMNS);
        maximum = MainTable.getPreferredSize().width;
        MainTable.setAutoResizeMode(PreviousAutoresize);
    }

    if (maximum < TotalWidth) 
        MainTable.setAutoResizeMode(MainTable.AUTO_RESIZE_ALL_COLUMNS);
    else 
        MainTable.setAutoResizeMode(MainTable.AUTO_RESIZE_OFF);
}

感谢您的关注。

1 个答案:

答案 0 :(得分:1)

  

我想创建一个程序来计算JTable中包含的所有单元格的宽度之和,如果结果小于其preferredWidth,则打开AUTO RESIZE模式

auto resize属性应该基于显示表格的滚动窗格的视口中的可用空间。

这需要在滚动窗格的大小发生变化时动态完成。

您可以在滚动窗格中添加ComponentListener并收听componentResized事件。然后你进行计算:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SSCCE extends JPanel
{
    public SSCCE()
    {
        setLayout( new BorderLayout() );

        JTable table = new JTable(5, 5);
        JScrollPane scrollPane = new JScrollPane( table );
        add( scrollPane );

        scrollPane.addComponentListener( new ComponentAdapter()
        {
            @Override
            public void componentResized(ComponentEvent e)
            {
                JScrollPane scrollPane = (JScrollPane)e.getComponent();
                JTable table = ((JTable)scrollPane.getViewport().getView());

                int tableWidth = table.getPreferredSize().width;
                int viewportWidth = scrollPane.getViewport().getSize().width;

                if (tableWidth < viewportWidth)
                    table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
                else
                    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            }
        });
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new SSCCE());
        frame.setLocationByPlatform( true );
        frame.pack();
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater( () -> createAndShowGUI() );
/*
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
*/
    }
}

或者另一种选择是覆盖JTable的一些默认布局处理,如下所示:JTable resize only selected column when container size changes