`
yuwei2008vip
  • 浏览: 38842 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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;

/**
* 本类实现了对JTable颜色的控制,提供了两套方案:
* 1.实现了表格行两种颜色交替的效果
* 2.实现了用一个控制颜色的字符串数组来设置所对应行的颜色
* 本文件与PlanetTable.java文件相配合使用
* @author Sidney
* @version 1.0 (2008-1-14)
*/
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);
    }

    /**
     * 根据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());
        }
    }

    /**
     * 将列设置为固定宽度。//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);
        }
    }
    
    /**
     * 根据数据内容自动调整列宽。//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)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);
         }
    }
    
    /**
     * 定义内部类,用于控制单元格颜色,每两行颜色相间,本类中定义为蓝色和绿色。
     *
     * @author Sidney
     *
     */
    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);
        }
    }

    /**
     * 定义内部类,可根据一个指定字符串数组来设置对应行的背景色
     *
     * @author Sidney
     *
     */
    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;


/**
* 本类为JTable一个简单应用,实现了JTable的行颜色设置及表格的打印功能
* 本文件与StyleTable.java文件相配合使用
*/
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);
    }
}

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

  • 大小: 23.6 KB
分享到:
评论

相关推荐

    JTable设置行背景颜色及实现打印功能的示例代码.doc

    在这个方法中,我们可以根据当前行的索引和颜色数组来决定行的背景色。 ```java public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { Component c = super.prepareRenderer...

    java Jtable 经典列设置+表格颜色.docx

    - **设置表格样式**:包括行高、行间距、是否可选行、选中行的背景色、网格线颜色等。 - **网格线显示**:通过`setShowGrid()`、`setShowHorizontalLines()`、`setShowVerticalLines()`控制网格线的显示。 ##### 3....

    TableCellRenderer的用法(JTable单元格背景颜色设置)

    实现设置JTable中某些单元格的背景色

    JTable自动换行

    然后,在`getTableCellRendererComponent`方法中,我们根据单元格的状态(是否被选中、是否有焦点)设置背景色和前景色,并将单元格的值赋给`JTextArea`的文本。 要使用这个自定义渲染器,你需要在`JTable`的列模型...

    javaJtable经典列设置+表格颜色.doc

    我们还使用 setRowSelectionAllowed 方法来设置是否允许选择行,并使用 setSelectionBackground 方法来设置选择行的背景色。 根据数据设置行颜色 在实际应用中,我们经常需要根据不同的条件来设置 JTable 的行颜色...

    JAVA_JTable_奇数行和偶数行设定显示不同颜色.doc

    `setColor` 方法是关键,它根据行号判断是奇数行还是偶数行,然后分别设置背景色。如果单元格被选中,背景色设为 `selectionColor`;否则,如果行号除以2的余数为0(即偶数行),背景色设为 `evenRowColor`;否则,...

    Jtable 中放入多个按钮

    // 设置其他属性,如背景色、边框等 if (isSelected) { panel.setBackground(table.getSelectionBackground()); } else { panel.setBackground(table.getBackground()); } return panel; } } ``` 2. **...

    java 中 Jtable的用法

    - 设置选中项的背景色:`table.setSelectionBackground(Color.black);` - 设置选中项的前景色:`table.setSelectionForeground(Color.white);` - 隐藏网格线:`table.setShowHorizontalLines(false); table....

    JTable颜色渲染代码

    例如,可以通过实现`getTableCellRendererComponent`方法来自定义不同条件下的单元格背景色或前景色。 - **行渲染器**:对于整个行的颜色定制,可以通过覆盖`JTable`的`prepareRenderer`方法来实现。这种方式可以...

    swing 中Jtable例子

    在这个例子中,我们将深入探讨如何使用`JTable`来实现单元格的合并、设置字体、字号、背景色和前景色。 首先,让我们了解`JTable`的基本用法。`JTable`通常与`DefaultTableModel`一起使用,`DefaultTableModel`负责...

    javaJtable经典列设置+表格颜色参考.pdf

    - 这个例子没有在提供的代码片段中直接展示如何根据发送的完成百分比设置行颜色,但提到了`RowColorRenderer_Running`类,这可能是一个自定义的单元格渲染器,用于根据特定条件(比如百分比)改变行的背景色。...

    JTable的一些小应用

    调整选中单元格的背景色和前景色: ```java table.setSelectionBackground(Color.yellow); table.setSelectionForeground(Color.red); ``` 此外,还可以隐藏网格线: ```java table.setShowHorizontalLines(false);...

    jtable中放多个Button.rar

    // 设置默认背景色和字体 super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); // 在这里根据value或者行/列索引来决定按钮的文字和行为 for (int i = 0; i ; i++) { ...

    一个复杂的JTable(转)

    5. 表格样式:可以自定义单元格的背景色、字体、边框等,使表格更加美观易读。 在提供的链接中,博主可能详细解释了如何实现上述功能,以及可能遇到的问题和解决方法。由于没有具体的博客内容,这里只能给出一般性...

    JAVA的JTable常用方法[借鉴].pdf

    分别设置选中行的背景色和前景色。 7. **设置网格线颜色**: `friends.setGridColor(Color.black);` 这个方法设置网格线的颜色。 8. **全选表格**: `friends.selectAll();` 选中表格的所有行。 9. **设置...

    JAVA的JTable常用方法[参考].pdf

    - `setSelectionBackground(Color)` 设置选中行的背景色,如 `friends.setSelectionBackground(Color.white)`。 - `setSelectionForeground(Color)` 设置选中行的前景色,如 `friends.setSelectionForeground...

    中级SWING-JTable属性

    这两个方法分别用于设置选中单元格的背景色和前景色。通过改变这些颜色,可以突出显示被选中的数据,从而提高用户体验。 #### 10. `setBackground()` 和 `setForeground()` 这些方法用于设置未选中单元格的背景色...

    易语言高级表格鼠标移动时改变行背景色-易语言

    设置行属性 (行号, "背景颜色", 新颜色) // 设置行背景色 .否则 .结束如果 .结束如果 .end事件 ``` 在这个例子中,`高级表格.获取行号` 函数用于获取鼠标位置对应的行号,`高级表格.设置行属性` 则用于设置行的...

    JTable表头合并

    为了实现合并,我们需要创建一个继承自`DefaultTableCellRenderer`的类,重写`getTableCellRendererComponent`方法,以便在需要合并的单元格上添加额外的样式,如设置背景色或边框。 ```java class ...

Global site tag (gtag.js) - Google Analytics