【问题标题】:JTable enable some checkbox columnJTable 启用一些复选框列
【发布时间】:2015-09-25 16:41:33
【问题描述】:

我有一个从数据库填充的jtable,但我想启用或灰显其中一些 jtable 行(存在于同一数据库的另一个表中的行),以便用户无法检查 checkbox 的这些行,但始终可以检查其余行(此表中不存在的行)。

for (int m = 0; m < tb_doublon.getRowCount(); m++) {
    Statement statdouble=null;  
    ResultSet rsdouble=null;

    //I get the value of the cell of the column 1 :id, line : i
    String id = (String)tb_doublon.getValueAt(m, 1);
    String cli = (String)tb_doublon.getValueAt(m, 2);

    //i browse the other table to enable or gray out the lines existing in that table with th id
    String doubleexistant ="select * from doublon where id='"+id+"' and cli='"+cli+"'" ;
    statdouble = conn.createStatement();
    rsdouble  = statdouble.executeQuery(doubleexistant);
    while (rsdouble.next()) {
      //i think this is here that i must enable or gray out the lines but i don't know how !!!!<br>             
    }
}

【问题讨论】:

  • 您必须创建一个自定义的表模型。请添加有关您的表模型的信息。另外我不建议在循环中运行 sql 语句。您可以通过适当的方式对其进行管理。

标签: java swing jtable jcheckbox


【解决方案1】:

先生,您可以在数组中创建复选框以便更轻松地访问它们。

JCheckBox [] checkboxes= new JCheckBox[WIDTH];

如果您发现第二个索引重复,您可以简单地禁用数组中的第二个复选框

checkboxes[1].setEnabled(false);

【讨论】:

    【解决方案2】:

    可以使用修改后的TableCellRenderer 为行着色。我创建了一个自定义的TableCellRenderer,如下所示。

    ColorTableRenderer.java

    可以添加行标记为灰色,并清除所有标记的行。

    public class ColorTableRenderer extends DefaultTableCellRenderer {
    
        //contains row indexes which need to color
        private final List<Integer> colorIndexes = new ArrayList<>();
    
        //add new index to show as color
        public void addColorIndex(Integer index) {
            colorIndexes.add(index);
        }
    
        //clear all color indexes
        public void clearColorIndexes() {
            colorIndexes.clear();
        }
    
        private boolean isColorIndex(Integer index) {
            return colorIndexes.contains(index);
        }
    
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    
            if (isColorIndex(row)) {//check if marked as colored
                component.setBackground(Color.LIGHT_GRAY);//highlight color
            } else {
                component.setBackground(Color.WHITE);//other color
            }
    
            return component;
        }
    }
    

    使用 ColorTableRenderer

    使用以下方法之一将ColorTableRenderer 设置为表。

        ColorTableRenderer renderer = new ColorTableRenderer();
    
        //set TableCellRenderer into a specified JTable column class
        table.setDefaultRenderer(String[].class, renderer);
    
        //or, set TableCellRenderer into a specified JTable column
        table.getColumnModel().getColumn(columnIndex).setCellRenderer(renderer);
    

    考虑到您的代码,您可以添加以下修改以使选定的行颜色。

        renderer.clearColorIndexes();
        for (int m = 0; m < tb_doublon.getRowCount(); m++) {
            Statement statdouble = null;
            ResultSet rsdouble = null;
    
            //I get the value of the cell of the column 1 :id, line : i
            String id = (String) tb_doublon.getValueAt(m, 1);
            String cli = (String) tb_doublon.getValueAt(m, 2);
    
            //i browse the other table to enable or gray out the lines existing in that table with th id
            String doubleexistant = "select * from doublon where id='" + id + "' and cli='" + cli + "'";
            statdouble = conn.createStatement();
            rsdouble = statdouble.executeQuery(doubleexistant);
            while (rsdouble.next()) {
                renderer.addColorIndex(m);
            }
        }
    

    这是我测试过的屏幕截图

    【讨论】:

      猜你喜欢
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      相关资源
      最近更新 更多