[英]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.