Java 动态更改JTable单元格的背景色

Java 动态更改JTable单元格的背景色,java,swing,Java,Swing,我想更改JTable的单元格背景颜色,并想从MySQL数据库中获取数据 我在MySQL中使用一个数据表,它有一个状态字段。如果状态为1,则单元格背景颜色应为红色;如果状态为0,则应更改为红色。id建议使用自定义单元格渲染器来实现您想要的效果 public class CellRenderer extends DefaultTableCellRenderer { private static final long serialVersionUID = 1L; @Override

我想更改JTable的单元格背景颜色,并想从MySQL数据库中获取数据


我在MySQL中使用一个数据表,它有一个状态字段。如果状态为1,则单元格背景颜色应为红色;如果状态为0,则应更改为红色。

id建议使用自定义单元格渲染器来实现您想要的效果

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);
}
private void createTable(容器窗格){
Object[]namen={“Datum”、“Kategorie”、“Essen”、“Preise Intern”、“Preise Extern”};
模型=新的DefaultTableModel(名称,0);
表=新JTable(型号){
公共布尔值可编辑(整数x,整数y){
返回false;
}
};
尺寸最小尺寸=新尺寸(1000500);
表.setPreferredScrollableViewportSize(最小值);
TableRowSorter分拣机=新的TableRowSorter(型号);
表.SetRow分拣机(分拣机);
sorter.setComparator(3,sorter.getComparator());
sorter.setComparator(4,sorter.getComparator());
table.getColumnModel().getColumn(3).setCellRenderer(新的CellRenderer());//自定义单元格渲染器
table.getColumnModel().getColumn(4).setCellRenderer(新的CellRenderer());//自定义单元格渲染器
JScrollPane sp=新的JScrollPane(表,JScrollPane.VERTICAL\u滚动条,根据需要,
JScrollPane.水平滚动条(根据需要);
}
我是如何填写的:

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);
    }
}
void刷新表内容(向量v){
对于(int i=table.getRowCount()-1;i>=0;i--){
模型1(i);
}
可填充(v);
}
空心填充表(向量v){
对于(int i=0;i
model
是一个
DefaultTableModel
,您可以在其上添加和删除数据。每次重新填充时,我首先删除所有行,然后添加新行。这可能不是最好的解决方案,但它确实有效

在本例中,该模型是一个包含多个字段的函数。所以我创建了一个我自己对象的向量,然后创建了一个帮助向量,并在其中存储了一顿饭的值。然后我将向量作为行添加到JTable中,下一顿饭存储在帮助向量中

我希望您能理解我在这里所做的工作

正如XtremeBaumer所建议的那样,自定义单元渲染器是实现所需功能的标准方法。只需记住,只创建了cell renderer类的一(1)个实例,用于渲染所有JTable单元格。
祝你好运

//这是我用来动态更改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
[绿色表示空(空闲)单元格,红色表示占用的单元格][1] int行,列,行1,列; TableCell渲染器; 私有静态最终整数状态_COL=1; String host=“jdbc:mysql://localhost/your_database"; 字符串username=“root”; 字符串密码=”; 语句stmt=null; 试一试{ Class.forName(“com.mysql.jdbc.Driver”); Connection connect=DriverManager.getConnection(主机、用户名、密码); stmt=connect.createStatement(); String sql=“您的查询”; 结果集rs=stmt.executeQuery(sql); ResultSetMetaData meta=rs.getMetaData(); 对象[][]数据=新对象[10][2]; DefaultTableModel=新的DefaultTableModel(数据,列); jTable1.setModel(DbUtils.resultsetTableModel(rs)); rs=stmt.executeQuery(sql); int rowCnt=0; 试一试{ rs=stmt.executeQuery(sql); 如果(rs.last()){ rowCnt=rs.getRow(); } }捕获(例外e){ System.out.println(“获取行计数时出错”); e、 printStackTrace(); } int nCol=rs.getMetaData().getColumnCount(); 列表表=新的ArrayList(); 字符串[]行=新字符串[nCol];
对于(int l=1;lso基本上你希望它一直是红色的吗?您好!一般来说,为了让人们在应用程序的上下文中以有意义的方式正确回答您的问题,我们需要从您的代码中看到一些相关的代码片段,在它的当前形式中,我们无法真正告诉您如何解决这个问题“使用if语句"或者诸如此类的傻事。所以基本上你希望我们搜索。关于如何改进JTable的设计,有一个很好的教程。这可能是一个好的开始,如果这不起作用,请返回一些代码。非常感谢你宝贵的回复。但我不知道如何使用动态ba连接到数据库并获取JTable中的值ckground单元格的颜色更改。我甚至希望将表的数据划分为40行的插槽,并保留在下一列中。这样,我有2000行,并希望以40行50列的格式显示。您能否举例说明您希望表的外观如何?您必须先创建表,然后用获取的数据填充它从数据库中感谢xtremebaumer的回复和关注。大家好!我终于可以完成我的任务了。谢谢你们的支持。