简体   繁体   English

根据来自 msyql 的结果集值更改 Jtable 单元格的颜色

[英]change color of Jtable cell based on resultset value from msyql

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.我使用 Netbeans 开发一个 java 应用程序,我有一个来自 MYSQL 数据库的结果集,我想把这些数据放在一个 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).当我想根据值更改 JTable 单元格的背景颜色时遇到问题(例如:如果 Jtable 中单元格的值不等于 1,则其颜色必须为红色)。 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);
}





}

Try this尝试这个

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

By calling table.setModel(new javax.swing.table.DefaultTableModel(data, column));通过调用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). JTable默认使用DefaultTableCellRenderer实例来渲染单元格,可以通过调用table.setDefaultRenderer(Integer.class, cellRenderer)将其替换为您自己的单元格渲染器 - 这会将自定义 cellrenderer 设置为所有Integer列( DefaultTableModel使用Object列)。 When table is being displayed, each cell of the table is customized by getTableCellRendererComponent(...) method of the table's cellrenderer.显示表格时,表格的每个单元格都由表格的cellrenderer 的getTableCellRendererComponent(...)方法自定义。 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.在此方法中,您拥有当前组件(单元格)及其值和位置(请参阅参数),您可以使用它们在渲染之前自定义单元格。

So if you want to set background color to RED for each cell in second column with value 1, you would write:因此,如果您想将第二列中值为 1 的每个单元格的背景颜色设置为红色,您可以这样写:

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

Passing table's data to cell renderer将表的data传递给单元格渲染器

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);
}
public class Product extends javax.swing.JPanel {
     
    public Product() {
        initComponents();
         
       getNewRenderedTable(p_table);
       
    }
      
    private static JTable getNewRenderedTable(final JTable table){
        table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer(){
            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
                super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                
                int status = Integer.parseInt((String) table.getModel().getValueAt(row, 7));
                
                if(status<=5){
                   setBackground(Color.red);
                   setForeground(Color.WHITE);
                }
                else{
                   setBackground(Color.WHITE);
                   setForeground(Color.black);
                }
                return this;
            }
        });
        return table;
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM