我想改变JTable的单元格背景颜色,想从MySQL数据库中获取数据。
我在MySQL中使用一个数据表,它有一个状态字段。如果状态为1,则单元格背景颜色应为红色;如果状态为0,则应更改为红色。
正如XtremeBaumer所建议的,自定义单元渲染器是实现所需功能的标准方法。请记住,只创建了cell renderer类的一(1)个实例,用于渲染所有JTable单元格<祝你好运!
//This is the code which I have used to change jtable cell background color dynamically
[green color indicates empty(free) cell and red color indicates occupied cells][1]
int row, col, row1, column;
TableCellRenderer renderer;
private static final int STATUS_COL = 1;
String host = "jdbc:mysql://localhost/your_database";
String username = "root";
String password = "";
Statement stmt = null;
try {
Class.forName("com.mysql.jdbc.Driver");
Connection connect = DriverManager.getConnection(host, username, password);
stmt = connect.createStatement();
String sql = "your query";
ResultSet rs = stmt.executeQuery(sql);
ResultSetMetaData meta = rs.getMetaData();
Object[][] data = new Object[10][2];
DefaultTableModel model = new DefaultTableModel(data, col);
jTable1.setModel(DbUtils.resultSetToTableModel(rs));
rs = stmt.executeQuery(sql);
int rowCnt = 0;
try{
rs = stmt.executeQuery(sql);
if(rs.last()){
rowCnt = rs.getRow();
}
} catch (Exception e){
System.out.println("Error getting row count");
e.printStackTrace();
}
int nCol = rs.getMetaData().getColumnCount();
List<String[]> table = new ArrayList<>();
String[] row = new String[nCol];
for(int l=1; l<rowCnt; l++)
{
for (int iCol = 1; iCol <= nCol; iCol++) {
Object obj = rs.getObject(iCol);
row[iCol - 1] = (obj == null) ? null : obj.toString();
jTable1.setDefaultRenderer(Object.class, new EntryCellRender());
}
table.add(row);
}
} catch (Exception e) {
System.out.println(e);
}
}
public class EntryCellRender extends DefaultTableCellRenderer {
private final Color alt2 = Color.RED;
private final Color alt1 = Color.GREEN;
private final Color invalidStatus = Color.RED;
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component cr = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if ("".equals(table.getValueAt(row, col))) {
setBackground(alt1);
} else {
setBackground(alt2);
}
return cr;
}
private Color colorAlternator(int row) {
if ((row % 2) == 0) {
return alt1;
} else {
return alt2;
}
}
}
enter code here
[1]: https://i.stack.imgur.com/Fi4LF.png
我建议使用自定义单元渲染器来实现您想要的效果。
public class CellRenderer extends DefaultTableCellRenderer {
private static final long serialVersionUID = 1L;
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (column == /*your column number goes here*/) {
this.setValue(table.getValueAt(row, column));
this.setBackground(Color.RED);
}
return this;
}
}
在设置颜色之前,您可以检查值是否为0或1,然后更改颜色(如果它是您想要的)
我如何使用数据库中的数据创建和填充/重新填充JTable:
表:
private void createTable(Container pane) {
Object[] namen = { "Datum", "Kategorie", "Essen", "Preise Intern", "Preise Extern" };
model = new DefaultTableModel(namen, 0);
table = new JTable(model) {
public boolean isCellEditable(int x, int y) {
return false;
}
};
Dimension minimumSize = new Dimension(1000, 500);
table.setPreferredScrollableViewportSize(minimumSize);
TableRowSorter<DefaultTableModel> sorter = new TableRowSorter<DefaultTableModel>(model);
table.setRowSorter(sorter);
sorter.setComparator(3, Sorter.getComparator());
sorter.setComparator(4, Sorter.getComparator());
table.getColumnModel().getColumn(3).setCellRenderer(new CellRenderer()); //custom cell renderer
table.getColumnModel().getColumn(4).setCellRenderer(new CellRenderer()); //custom cell renderer
JScrollPane sp = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
}
我是如何填写的:
void refreshTableContent(Vector<Gericht> v) {
for (int i = table.getRowCount() - 1; i >= 0; i--) {
model.removeRow(i);
}
fillTable(v);
}
void fillTable(Vector<Gericht> v) {
for (int i = 0; i < v.size(); i++) {
Gericht g = v.get(i);
Vector<Object> vhelp = new Vector<>();
vhelp.add(df.format(g.getDate()));
vhelp.add(g.getClassification());
vhelp.add(g.getName());
vhelp.add(g.getPreisIntern());
vhelp.add(g.getPreisExtern());
model.addRow(vhelp);
}
}
在每次重新填充时,我首先删除所有行,然后添加新的行。这可能不是最好的解决方案,但它是有效的
所以我创建了我自己的对象的一个向量,然后创建了一个帮助向量,并存储了一顿饭的值膳食储存在帮助载体中。
我希望你能理解我在这里所做的
这听起来可能有点奇怪,但解释我的问题的最好方法就是如标题所述。 我有一个JTable,它使用自定义Tablemodel,在这个Tablemodel我有不同的方法。 我需要一种方法,当我在Tablemodel中调用一个特定的方法时,转到它被添加到的表,并更改位置(X,Y)单元格的背景颜色。 我可以从Tablemodel访问JTable对象。 为了澄清这个问题,有一个使用特定Tablemodel的JT
我正在使用RangeSeekBar为3种情况设置一些值(即绿色=OK,琥珀色=警告,红色=撤离)...我正在使用xml绘图来设置背景 我知道我可以通过编程更改渐变,但如何缩小起始颜色并增加结束颜色?有人能解决这个问题吗? 谢谢
问题内容: 我正在尝试使用渲染器为jTable的单元格上色,但是它们工作不佳,因为它们滞后于表格并且无法看到。这是我的代码: 我没有将其放入rendererclass中,因为它滞后了,我将其放入cicle的双精度中,具体地说,放入了第二个cicle。我希望它为超过24的单元格上色,如果现在我写的话,那是行不通的 它使桌子完全着色 编辑 按照要求,我创建了一个描述我的问题的小示例,我不知道是否存在发
问题内容: 我想制作一个可编辑的表,然后检查数据以确保其有效。我不确定如何仅更改一个单元格的颜色。我想要一个单元格,例如(0,0)并将前景颜色设置为红色。我已经阅读了SO和Oracle上有关自定义ColorRenderer的其他文章,但是我不知道如何使用它。 谢谢。 问题答案: 假设您要用其他颜色渲染的单元格代表一种状态(我将以“拒绝并批准”为例)。然后,我将在我的表模型中实现一个名为getSta
问题内容: 我试图使自己熟悉JTables,TableModels,JTableHeaders,渲染器等。我试图制作一个简单的虚拟表(出于练习目的),看起来像这样: 我还希望B2单元格-并且只有该单元格-具有蓝色(Color.BLUE)背景-所有其他单元格都可以具有自动分配的Swing默认颜色。 我的代码在下面,并且基于我在本网站和整个互联网上发现的无数示例。但是我没有得到想要的结果。相反,我得到