`

自定义Swing Table

    博客分类:
  • java
阅读更多

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);
        }
    }


}

分享到:
评论

相关推荐

    swing table加复选框

    在Java的Swing库中,`JTable`是用于创建二维数据展示的组件,它类似于电子表格。在某些场景下,我们可能需要在`JTable`的每一行中添加复选框,以便用户可以选择或取消选择特定行。这通常用于实现多选功能,例如在...

    swing实现布局+滚动+自定义table+组件

    swing实现布局+滚动+自定义table+组件

    java_swing大量的table例子

    这个压缩包文件"java_swing大量的table例子"显然提供了丰富的`JTable`使用示例,对于学习和开发涉及表格功能的Java Swing应用非常有帮助。 一、`JTable`基础知识 1. `JTable`构造:`JTable()`、`JTable(Object[][]...

    Swing中JTABLE中添加JBUTTON控件

    在Java的Swing库中,`JTable`是用于创建数据网格视图的重要组件,它允许用户以表格的形式查看和操作数据。而`JButton`则是一个常用的按钮控件,通常用于触发某些动作或事件。将`JButton`添加到`JTable`中可以为用户...

    Swing 的table显示代码

    本示例中,我们看到的`Swing`的`table`显示代码涉及到了`JTable`的使用,以及与MySQL数据库的交互。下面将详细解释这些知识点。 1. **JTable**: `JTable`是Java Swing中的一个组件,它允许开发者创建和显示二维数据...

    Swing Paging Table

    Swing Paging Table是一种在Java Swing环境中实现的分页表格组件,它允许用户高效地处理大量数据,而无需一次性加载所有数据到内存中。这个组件特别适用于数据集过大,可能导致性能下降或内存溢出的情况。通过分页...

    JTable实现行间拖拽的最简单方法

    在Java Swing应用中,`JTable`是一种常用的组件,用于展示和操作二维数据。它提供了丰富的功能,如排序、选择和编辑。然而,`JTable`默认并不支持行间的拖放(Drag and Drop, DnD)操作。本文将详细介绍如何通过一种...

    JTable使用自定义数据类型示例工程

    这个工程提供了一个实际操作的例子,帮助开发者理解和学习如何在Swing应用程序中使用自定义`TableCellRenderer`和`TableCellEditor`,以提高用户界面的交互性和可视化效果。 总结一下,本示例主要涉及以下几点: 1...

    中级SWING-JTable属性

    ### 中级SWING-JTable属性详解 在Java Swing框架中,`JTable`是一个非常重要的组件,用于展示表格数据。为了更好地控制表格的表现形式及功能,`JTable`提供了多种属性设置方法。以下是对给定内容中提到的一些关键...

    Swing JTable工厂(table4j)

    Swing中的JTable是Java GUI开发中非常重要的一个组件,用于展示二维数据表格。它允许用户查看、编辑和操作表格中的数据。`table4j`可能是某个特定的库或者工具,用于增强或简化JTable的使用。这篇博客文章(链接已...

    Java JTable Demo

    Java JTable是Java Swing库中的一个关键组件,用于在桌面应用程序中展示表格数据。它提供了丰富的功能,使得用户可以查看、编辑和操作二维数据集。在这个"Java JTable Demo"中,我们将深入探讨如何有效地使用JTable...

    精通java-swing开发.doc

    - `javax.swing.table`:与`JTable`组件相关的类,用于创建和管理表格数据。 - `javax.swing.text`:包含文本组件相关的类,如`JTextComponent`,支持文本编辑和格式化。 - `javax.swing.text.html`:处理HTML文本...

    Swing 扩展组件 Swing 扩展组件

    Swing还支持自定义组件,开发者可以通过继承现有的组件类并重写其方法,或者使用`JComponent`类来构建完全自定义的UI元素。这种灵活性使得Swing成为Java GUI开发的强大工具,可以满足各种复杂应用的需求。 在实际...

    swing 合并单元格的表格

    `CombineData.java`可能包含数据模型类,它扩展了`javax.swing.table.DefaultTableModel`或自定义的模型类,以支持合并单元格的逻辑。在这个类中,可能有额外的属性或方法来存储合并信息,如合并的开始行、结束行、...

    java.swing总结

    Swing 包含了大量组件,如 JTable 和 JTree,它们在相应的子包中,例如 swing.table 和 swing.tree。 Swing 的多样化体现在它不仅提供了与 AWT 相似的组件,而且还增加了许多高级组件。例如,JTable 用于展示数据...

    Swing MVC 代码示例

    例如,你可以创建一个自定义的`TableModel`,并在其中添加`TableModelListener`来监听数据变更。同时,为Swing组件添加事件监听器(如`ActionListener`)作为控制器,处理用户交互。 以下是一个简单的Swing MVC代码...

    Java中Swing.pdf

    7. `javax.swing.table`:提供了`JTable`组件的实现,用于展示表格数据。 8. `javax.swing.text`:包含处理文本的类和接口,如文本字段和文本区域。 9. `javax.swing.tree`:提供了`JTree`组件,用于显示层次结构...

    swing 学习 有时间学学

    10. `javax.swing.table` - JTable组件及其相关支持。 11. `javax.swing.text` - 文本组件,如JTextComponent,用于文本的显示和编辑。 12. `javax.swing.text.html` - 支持HTML文档的显示和编辑。 13. `javax.swing...

    javaswing详解

    JTable table = new JTable(model); ``` 4. 自定义布局管理:通过实现LayoutManager接口或使用预定义的布局管理器,如FlowLayout、GridLayout、BorderLayout等,可以自由调整组件的位置和大小。 总结,Java Swing...

    java Swing、SWT分页

    在Swing中实现分页通常涉及使用JTable、JList或者自定义组件。`JTable`是Swing中用于显示表格数据的标准组件,可以结合`DefaultTableModel`或自定义的`TableModel`实现数据的分页显示。你可以通过设置`JTable`的行数...

Global site tag (gtag.js) - Google Analytics