JTable中实现行背景颜色、固定表格列宽、根据内容自动调整列宽、列中数据排序等功能示例代码

(1)StyleTable.java文件用于实现各种上面提到的功能。

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;



import java.util.Enumeration;

import javax.swing.JTable;
import javax.swing.RowSorter;
import javax.swing.table.DefaultTableCellRenderer;

import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;


public class StyleTable extends JTable 
{
    private String[] color = null; //用于设定行颜色的数组

    public StyleTable() 
    {
        super();
    }

    public StyleTable(Object[][] rowData, Object[] columnNames) 
    {
        super(rowData, columnNames);
        paintRow(); //将奇偶行分别设置为不同颜色
        
        //setFixColumnWidth(this); //固定表格的列宽
        
        //通过点击表头来排序列中数据resort data by clicking table header
        RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(this.getModel());
        this.setRowSorter(sorter);
        
        this.setIntercellSpacing(new Dimension(5,5)); //设置数据与单元格边框的眉边距
        
        //根据单元内的数据内容自动调整列宽resize column width accordng to content of cell automatically
        fitTableColumns(this);
    }

    public StyleTable(Object[][] rowData, Object[] columnNames, String[] color) 
    {
        super(rowData, columnNames);
        this.color = color;
        paintColorRow();
        
        setFixColumnWidth(this);
        
        RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(this.getModel());
        this.setRowSorter(sorter);
        
        this.setIntercellSpacing(new Dimension(5,5));
        
        fitTableColumns(this);
    }

    
    public void paintRow() 
    {
        TableColumnModel tcm = this.getColumnModel();
        for (int i = 0, n = tcm.getColumnCount(); i < n; i++) 
        {
            TableColumn tc = tcm.getColumn(i);
            tc.setCellRenderer(new RowRenderer());
        }
    }

    public void paintColorRow() 
    {
        TableColumnModel tcm = this.getColumnModel();
        for (int i = 0, n = tcm.getColumnCount(); i < n; i++) 
        {
            TableColumn tc = tcm.getColumn(i);
            tc.setCellRenderer(new RowColorRenderer());
        }
    }

    
    public void setFixColumnWidth(JTable table)
    {
        //this.setRowHeight(30);
        this.setAutoResizeMode(table.AUTO_RESIZE_OFF);
       
        //The following code can be used to fix table column width
        TableColumnModel tcm = table.getTableHeader().getColumnModel();
        for (int i = 0; i < tcm.getColumnCount(); i++) 
        {
            TableColumn tc = tcm.getColumn(i);
            tc.setPreferredWidth(50);
            // tc.setMinWidth(100);
            tc.setMaxWidth(50);
        }
    }
    
    
    public void fitTableColumns(JTable myTable)
    {
         myTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
         JTableHeader header = myTable.getTableHeader();
         int rowCount = myTable.getRowCount();
         Enumeration columns = myTable.getColumnModel().getColumns();
         while(columns.hasMoreElements())
         {
             TableColumn column = (TableColumn)columns.nextElement();
             int col = header.getColumnModel().getColumnIndex(column.getIdentifier());
             int width = (int)header.getDefaultRenderer().getTableCellRendererComponent
             (myTable, column.getIdentifier(), false, false, -1, col).getPreferredSize().getWidth();
             for(int row = 0; row < rowCount; row++)
             {
                 int preferedWidth = (int)myTable.getCellRenderer(row, col).getTableCellRendererComponent
                 (myTable, myTable.getValueAt(row, col), false, false, row, col).getPreferredSize().getWidth();
                 width = Math.max(width, preferedWidth);
             }
             header.setResizingColumn(column); // 此行很重要
             column.setWidth(width+myTable.getIntercellSpacing().width);
         }
    }
    
    
    private class RowRenderer extends DefaultTableCellRenderer 
    {
        public Component getTableCellRendererComponent(JTable t, Object value,
                    boolean isSelected, boolean hasFocus, int row, int column) 
        {
            //设置奇偶行的背景色,可在此根据需要进行修改
            if (row % 2 == 0)
                setBackground(Color.BLUE);
            else
                setBackground(Color.GREEN);
   
            return super.getTableCellRendererComponent(t, value, isSelected,
                    hasFocus, row, column);
        }
    }

    
    private class RowColorRenderer extends DefaultTableCellRenderer 
    {
        public Component getTableCellRendererComponent(JTable t, Object value,
                    boolean isSelected, boolean hasFocus, int row, int column) 
        {
            //分支判断条件可根据需要进行修改
            if (color[row].trim().equals("E")) 
            {
                setBackground(Color.RED);
            } 
            else if (color[row].trim().equals("H")) 
            {
                setBackground(Color.CYAN);
            } 
            else if (color[row].trim().equals("A")) 
            {
                setBackground(Color.BLUE);
            } 
            else if (color[row].trim().equals("F")) 
            {
                setBackground(Color.ORANGE);
            } 
            else 
            {
                setBackground(Color.WHITE);
            }
   
            return super.getTableCellRendererComponent(t, value, isSelected,
                    hasFocus, row, column);
        }
    }
}

(2)PlanetTable.java文件用于利用上面的实现展示功能。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;



import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;



public class PlanetTable 
{
    public static void main(String[] args) 
    {
        JFrame frame = new PlanetTableFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

class PlanetTableFrame extends JFrame 
{
    private Object[][] cells = {
            { "Mercury", new Double(2440.0), new Integer(0),
              new Boolean(false), Color.yellow },
            { "Venus", new Double(60520.0), new Integer(0), new Boolean(false),
              Color.yellow },
            { "Earth", new Double(6378.0), new Integer(1), new Boolean(false),
              Color.blue },
            { "Mars", new Double(3397.0), new Integer(2), new Boolean(false),
              Color.red },
            { "Jupiter", new Double(71492.0), new Integer(16),
              new Boolean(false), Color.orange } };

    private String[] columnNames = { "Planet", "Radius", "Moons", "Gaseous",
            "Color" };

    private static final int DEFAULT_WIDTH = 400;
    private static final int DEFAULT_HEIGHT = 200;
    
    public PlanetTableFrame() 
    {
        // 用于控制每一行颜色的数组
        String[] color = { "H", "A", "F", "E", "W" };

        setTitle("PlanetTable");
        setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
        // 定义JTable,实例成自己扩展的JTable类,并传入用于设定颜色的数组
        //final JTable table = new StyleTable(cells, columnNames, color);
        // 下面这行代码可实现相邻两行颜色交替的效果,注意与上一行的区别
         final JTable table = new StyleTable(cells, columnNames);
        add(new JScrollPane(table), BorderLayout.CENTER);
        
        JButton printButton = new JButton("Print");
        printButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) 
            {
                try {
                        table.print();
                } catch (java.awt.print.PrinterException e) {
                    e.printStackTrace();
                }
            }
        });
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(printButton);
        add(buttonPanel, BorderLayout.SOUTH);
    }
}

效果图如下(根据代码微调会使效果图不同):

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值