首页 > 解决方案 > 我想将数据表单元格背景从 sql 更改为 JTable Eclipse

问题描述

package Inventory;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
import java.sql.*;
import java.util.Vector;

public class test {

    public static void main(String[] args) {

        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        String s;
        try {
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbInventory", "root", "");
            st = con.createStatement();
            s = "select * from stocks";
            rs = st.executeQuery(s);
            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);
            }
            JFrame frame = new JFrame();
            frame.setSize(500, 280);
            frame.setLocationRelativeTo(null);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JPanel panel = new JPanel();
            JTable table = new JTable(data, column);
            table.setDefaultEditor(Object.class, null);
            table.setGridColor(Color.red);
            JScrollPane jsp = new JScrollPane(table);
            panel.setLayout(new BorderLayout());
            panel.add(jsp, BorderLayout.CENTER);
            frame.setContentPane(panel);
            frame.setVisible(true);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "ERROR");
        } finally {
            try {
                st.close();
                rs.close();
                con.close();
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "ERROR CLOSE");
            }
        }
    }
}

如果 QTUANTITY 低于 50,我想更改单元格颜色:

在此处输入图像描述

标签: javaswingjtable

解决方案


您想要的是为您的JTable列提供一个自定义表格单元格渲染器。这样,您可以定义每个单元格的呈现方式。

下面发布的最小示例执行以下操作:

  • JTable使用一些虚拟数据构建。
  • 定义class CustomColumnCellRenderer哪些函数作为“数量”列的单元格渲染器。在那里,检查单元格值并相应地为单元格着色。
  • JTable显示JScrollPaneJFrame. _

这是一个简短的演示:

import java.awt.Color;
import java.awt.Component;

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;

public class Test {

    public static void main(String[] args) throws Exception {
        SwingUtilities.invokeLater(() -> new Test().buildGui());
    }

    public void buildGui() {
        JFrame frame = new JFrame();

        Object[][] data = { { 10001, "Patties", 45 }, { 10002, "Burger Buns", 63 }, { 10003, "Bacon", 37 } };
        String[] header = { "ITEM_CODE", "PRODUCT", "QUANTITY" };
        JTable table = new JTable(data, header);
        // set the custom renderer for "quantity" column
        table.getColumnModel().getColumn(2).setCellRenderer(new CustomColumnCellRenderer());

        JScrollPane scrollPane = new JScrollPane(table);
        frame.add(scrollPane);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    class CustomColumnCellRenderer extends DefaultTableCellRenderer {
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
                int col) {
            // parse cell to JLabel for appropriate coloring
            JLabel l = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
            // parse the value to render to int for comparison
            int parsedValue = Integer.parseInt(value.toString());
            if (parsedValue < 50) {
                l.setBackground(Color.RED);
            } else {
                l.setBackground(Color.GREEN);
            }
            // returns the JLabel to be rendered
            return l;
        }
    }
}

结果:

结果


推荐阅读