自定义Swing Table

Swing的JTable功能还是极其有限,根据网上一些资料,整理一下自定义了一个MyStyleTable类。利用它可以点击表头排序,行背景颜色交替,可以根据单元格内容自动调整列宽,当然也可也固定列宽。代码如下:

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.ListSelectionModel;
import javax.swing.RowSorter;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;


public class MyStyleTable extends JTable {

   
    private String[] color = null;
    private String[] header= new String[]{"NO", "Incurred Date", "Clinic", "Doctor", "Sequence", "Service Code", "Drug Code", "Description", "Amount", "Voucher No.", "Diagnosis 1", "Diag Desc 1", "Diagnosis 2", "Diag Desc 2", "Diagnosis 3", "Diag Desc 3", "Patient Name", "Staff No.", "Member Code", "Role"};
    private TableModel model;
    public MyStyleTable() {
        super();     
    }

  
    public MyStyleTable(Object[][] rowData){

        //add mouse event for table
         this.addMouseListener(new MouseAdapter() {

            public void mouseClicked(MouseEvent evt) {
                if (evt.getClickCount() == 2) {

                    try {
                        // TODO add your handling code here:

                        String cmd = "cmd /c start " + System.getProperty("user.dir") + "/pdf/" + MyStyleTable.this.getModel().getValueAt(MyStyleTable.this.getSelectedRow(), 9).toString() + ".tif";

                        Runtime.getRuntime().exec(cmd);

                    } catch (IOException ex) {
                        Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        });
        this.init(rowData);
    }

    //fix table column width
    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);
        }
    }

    //update model for table
    public void init(Object[][] rowData) {
         if(rowData!=null){
        this.setRowSelectionAllowed(true);
        this.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        this.setColumnSelectionAllowed(false);
        this.getTableHeader().setForeground(Color.BLUE);

         model = new DefaultTableModel(rowData, header) {

            public Class getColumnClass(int column) {
                Class returnValue;
                if ((column >= 0) && (column < getColumnCount())) {
                    returnValue = getValueAt(0, column).getClass();
                } else {
                    returnValue = Object.class;
                }
                return returnValue;
            }

            @Override
            public boolean isCellEditable(int row, int column) {
                return false;
            }
        };
      
         this.setModel(model);

       //resort data by clicking table header
        RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
        this.setRowSorter(sorter);

        //set row background color
        this.paintRow();


        this.setIntercellSpacing(new Dimension(5,5));

        //resize column width accordng to content of cell automatically
        fitTableColumns(this);
         }
    }

  

    /**
     * 根据color数组中相应字符串所表示的颜色来设置某行的颜色,注意,JTable中可以对列进行整体操作
     * 而无法对行进行整体操作,故设置行颜色实际上是逐列地设置该行所有单元格的颜色。
     */
    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());
        }

 

    }

    //resize column width automatically
    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)myTable.getTableHeader().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 JTextArea implements TableCellRenderer {

        public RowRenderer() {
            //multiple line mode
           // setLineWrap(true);
           // setWrapStyleWord(true);
        }

        public Component getTableCellRendererComponent(JTable t, Object value,
                boolean isSelected, boolean hasFocus, int row, int column) {
            //设置奇偶行的背景色,可在此根据需要进行修改
            if (row % 2 == 0) {
                setBackground(Color.getHSBColor(63, 11, 91));
            } else {
                setBackground(Color.getHSBColor(214, 14, 98));
            }


            int maxPreferredHeight = 0;
            for (int i = 0; i < t.getColumnCount(); i++) {
                setText("" + t.getValueAt(row, i));
                setSize(t.getColumnModel().getColumn(column).getWidth(), 0);
                maxPreferredHeight = Math.max(maxPreferredHeight, getPreferredSize().height);
            }

            if (t.getRowHeight(row) != maxPreferredHeight)
            {
                t.setRowHeight(row, maxPreferredHeight);
            }

            setText((value == null || "null".equals(value)) ? "" : value.toString());


            return this;

        }
    }

    /**
     * 多行颜色交替
     *
     */
    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("R")) {
                setBackground(Color.RED);
            } else if (color[row].trim().equals("C")) {
                setBackground(Color.CYAN);
            } else if (color[row].trim().equals("B")) {
                setBackground(Color.BLUE);
            } else if (color[row].trim().equals("O")) {
                setBackground(Color.ORANGE);
            } else {
                setBackground(Color.WHITE);
            }

            return super.getTableCellRendererComponent(t, value, isSelected,
                    hasFocus, row, column);
        }
    }


}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值