根据来自msyql的结果集值更改Jtable单元格的颜色 [英] change color of Jtable cell based on resultset value from msyql

查看:62
本文介绍了根据来自msyql的结果集值更改Jtable单元格的颜色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用Netbeans开发Java应用程序,我从MYSQL数据库获得了一个结果集,我想将此数据放入JTable中. 我想根据其值更改JTable单元格的背景颜色时遇到问题(例如:如果Jtable中单元格的值不等于1,则其颜色必须为红色). 这是我的代码:

I use Netbeans to develop a java application, I have a result set from MYSQL database and i want to put this data in a JTable. I have a problem when I want to change background color of a JTable cell based on its value (ex: if the value of a cell in Jtable isn't equal to 1, its color must be red). Here is my code:

    /*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * 
 */
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.sql.*;
import java.util.Vector;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

public class Cell2 {

    // JDBC driver name and database URL
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost/db";

    //  Database credentials
    static final String USER = "root";
    static final String PASS = "(abdc)";

    public void queryABTS(JTable table) {
        Connection conn = null;
        Statement stmt = null;
        try {
            //STEP 2: Register JDBC driver
            Class.forName("com.mysql.jdbc.Driver");

            //STEP 3: Open a connection
            System.out.println("Connecting to database...");
            conn = DriverManager.getConnection(DB_URL, USER, PASS);

            //STEP 4: Execute a query
            System.out.println("Creating statement...");
            stmt = conn.createStatement();
            String sql;
            sql = "SELECT * from dbn;";
            ResultSet rs = stmt.executeQuery(sql);
            ResultSetMetaData rsmt = rs.getMetaData();
            int c = rsmt.getColumnCount();
            Vector column = new Vector(c);
            for (int i = 1; i <= c; i++) {
                column.add(rsmt.getColumnName(i));
            }
            Vector data = new Vector();
            Vector row = new Vector();
            while (rs.next()) {
                row = new Vector(c);
                for (int i = 1; i <= c; i++) {
                    row.add(rs.getString(i));
                }
                data.add(row);
            }

            table.setModel(new javax.swing.table.DefaultTableModel(data, column));
            table.getTableHeader().setFont(new Font("SansSerif", Font.BOLD, 13));
           // table.getValueAt(1, 1);

            TableColumn column1 = null;

            for (int i = 0; i < 5; i++) {
                column1 = table.getColumnModel().getColumn(i);
                if (i == 3) {
                    column1.setPreferredWidth(150); //third column is bigger

                } else {
                    column1.setPreferredWidth(50);

                }
            }

            setCellRenderer(table);
            //color cell =======================================================================

             // end color cell ==================================================================


//========================================================

//=======================================================
            //STEP 6: Clean-up environment
            rs.close();
            stmt.close();
            conn.close();
        } catch (SQLException se) {
            //Handle errors for JDBC
            se.printStackTrace();
        } catch (Exception e) {
            //Handle errors for Class.forName
            e.printStackTrace();
        } finally {
            //finally block used to close resources
            try {
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException se2) {
            }// nothing we can do
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException se) {
                se.printStackTrace();
            }//end finally try
        }//end try
        System.out.println("Goodbye!");
    }//end main  


public static TableCellRenderer createCellRenderer() {
    return new DefaultTableCellRenderer() {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            Component c =  super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

            if (column == 4 && "1".equals((String) value)) {
    c.setBackground(Color.RED);
    }

            return c;
        }
    };
}

public static void setCellRenderer(JTable table) {
    TableCellRenderer cellRenderer = createCellRenderer();
    table.setDefaultRenderer(Object.class, cellRenderer);
}





}

推荐答案

尝试一下

public static TableCellRenderer createCellRenderer() {
    return new DefaultTableCellRenderer() {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            Component c =  super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

            c.setBackground(Color.GREEN);

            return c;
        }
    };
}

public static void setCellRenderer(JTable table) {
    TableCellRenderer cellRenderer = createCellRenderer();
    table.setDefaultRenderer(Object.class, cellRenderer);
}

通过调用table.setModel(new javax.swing.table.DefaultTableModel(data, column));,您正在将数据放入表模型中. JTable默认使用DefaultTableCellRenderer实例渲染单元格,可以通过调用table.setDefaultRenderer(Integer.class, cellRenderer)将其替换为您自己的单元格渲染器-这会将自定义cellrenderer设置为所有Integer列(DefaultTableModel使用Object列) .当显示表格时,表格的每个单元格都是通过表格的单元格渲染器的getTableCellRendererComponent(...)方法自定义的.在此方法中,您具有当前组件(单元格)及其值和位置(请参见参数),可用于在渲染之前自定义单元格.

By calling table.setModel(new javax.swing.table.DefaultTableModel(data, column)); you are putting your data into the table model. JTable uses by default DefaultTableCellRenderer instance to render cells, which can be replaced by your own cell renderer by calling table.setDefaultRenderer(Integer.class, cellRenderer) - this will set custom cellrenderer to all Integer columns (DefaultTableModel uses Object columns). When table is being displayed, each cell of the table is customized by getTableCellRendererComponent(...) method of the table's cellrenderer. In this method, you have current component (cell) with it's value and position (see parameters), that you can use to customize your cell before getting rendered.

因此,如果您想将第二列中每个单元格的背景色设置为红色(值1),则应输入:

So if you want to set background color to RED for each cell in second column with value 1, you would write:

if (column == 1 && ((Integer) value) == 1) {
    c.setBackground(Color.RED);
}

将表格的data传递到单元格渲染器

Passing table's data to cell renderer

public static TableCellRenderer createCellRenderer(final Vector data) {
    return new DefaultTableCellRenderer() {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        Component c =  super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

            // use data to customize current component

            return c;
        }
    };
}

public static void setCellRenderer(JTable table, Vector data) {
    // Vector data = ((DefaultTableModel) table.getModel()).getDataVector();
    TableCellRenderer cellRenderer = createCellRenderer(data);
    table.setDefaultRenderer(Object.class, cellRenderer);
}

这篇关于根据来自msyql的结果集值更改Jtable单元格的颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆