根据来自msyql的结果集值更改Jtable单元格的颜色 [英] change color of Jtable cell based on resultset value from msyql
问题描述
我使用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屋!