当前位置: 首页 > 知识库问答 >
问题:

复选框在JTable中不工作/不可编辑

西门梓
2023-03-14

这个类创建一个有6列的jtable,最后一列包含布尔复选框。我在getColumnClass中指定了它。我不能取消选中/选中这些框,它们是不可编辑的。我怀疑MyTableModel类中的setValueAt和getValueAt方法不正确,但我无法理解。请帮帮忙。这里有3个我要展示的类:带有main方法的gui类,扩展AbstractTableModel的MyTableModel和cell renderer类ColorRenderer。

import java.awt.Color;
import java.awt.Component;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;

public class table extends JFrame {

    JTable table = new JTable();
    MyTableModel model = new MyTableModel(getDummyData());
    JScrollPane scroll;
    List<Integer> highlightedCell;

    public table() throws FileNotFoundException, IOException, InvalidFormatException {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    public Vector getDummyData() throws IOException, InvalidFormatException {
        highlightedCell = new ArrayList<Integer>();
        String nnnname;
        Vector vector;
        Vector vectorOfVector = new Vector();
        excelToList e = new excelToList("input.xls");
        List<Person> names = e.createWorkbook();
        int rowNum = 0;
        for (Person p : names) {
            nnnname = p.getName();
            vector = new Vector();
            vector.add(nnnname);
            vector.add(p.getDone());
            vector.add(p.getWaiting());
            vector.add(p.getORDERED());
            vector.add(p.getKPR1());
            vector.add(new Boolean(false));
            vectorOfVector.add(vector);
            rowNum++;
            if ((nnnname.matches("\\A\\p{ASCII}*\\z"))) {
                highlightedCell.add(rowNum - 1);
            }
        }
        return vectorOfVector;

    }

    public void createTable() throws FileNotFoundException, IOException, InvalidFormatException {


        table.setModel(model);
        table.setFillsViewportHeight(true);
        TableCellRenderer original = table.getDefaultRenderer(Object.class);
        table.setDefaultRenderer(Object.class,
                new ColorRenderer(highlightedCell, original));
        scroll = new JScrollPane(table);
        add(scroll);
        setSize(1000, 1000);
    }
    public static void main(String args[]) throws FileNotFoundException, IOException,     InvalidFormatException {
        table t = new table();
        t.createTable();
    }
}

class MyTableModel extends AbstractTableModel {

    private String[] columnName = {"NAME", "DONE", "WAITING",
        "OVERALL", "PERCENTAGE 1", "PERCENTAGE 2"};
    private Vector dataVector;

    public MyTableModel(Vector vectorOfVector) throws IOException, InvalidFormatException {
        dataVector = vectorOfVector;

    }

    public int getRowCount() {
        return dataVector.size();
    }

    public int getColumnCount() {
        return columnName.length;
    }
    Vector v;

    public Object getValueAt(int i, int i1) {
        v = (Vector) dataVector.elementAt(i);
        return v.elementAt(i1);
    }

    @Override
    public Class getColumnClass(int c) {
        switch (c) {
            case 5:
                return Boolean.class;
            default:
                return String.class;
        }
    }

    @Override
    public boolean isCellEditable(int row, int col) {
        if (col < 1) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public void setValueAt(Object value, int row, int col) {
        Vector rowVector = (Vector) dataVector.get(row);
        rowVector.set(col, value);

        fireTableCellUpdated(row, col);
    }
}


class ColorRenderer implements TableCellRenderer {

    List<Integer> highlightedCoordinates;
    private TableCellRenderer cellRenderer;

    public ColorRenderer(List<Integer> list, TableCellRenderer cellRenderer) {
        if (cellRenderer == this || cellRenderer == null) {
            throw new IllegalArgumentException();
        }
        this.cellRenderer = cellRenderer;

        highlightedCoordinates = list;

    }

    public Component getTableCellRendererComponent(JTable jtable, Object color,
            boolean isSelected, boolean hasFocus, int row, int column) {
        Component c;
        c = cellRenderer.getTableCellRendererComponent(jtable, color, hasFocus, hasFocus, row, row);


        if (column == 0 && highlightedCoordinates.contains(row)) {
            c.setBackground(Color.GREEN);
        } else {
            c.setBackground(Color.yellow);
        }

        return c;
    }
}

共有2个答案

於子晋
2023-03-14

将你的是可编辑的(整行,整行)改为对以下内容:

public boolean isCellEditable(int row, int col) {   
  if (col < 1) {    
      return true;  
  } else if( col == 5){//column with your checkboxes.
      return true;
  } else {
      return false;   
  }
} 
宋奇希
2023-03-14
public boolean isCellEditable(int row, int col) {
    if (col < 1) {
        return true;
    } else {
        return false;
    }
}

如果我的理解是正确的,你试图只设置第0列为可编辑。添加复选框的列索引以返回true。

 类似资料:
  • 我正在为listview的每个Iten使用listview实现复选框。我遇到的问题是,当我点击任何一个复选框时,当我滚动时,其他一些没有点击的复选框也会被随机点击。我在SO上通过了许多链接,但它并没有解决我的问题。 我的xml文件是

  • 我有几个复选框。基于JSON响应(通过ajax-requests加载数据),我使用.prop()函数设置和重置复选框的默认值。问题是,如果我手动改变它们,它们显然不会改变这种行为。我不能通过$('#checkbox:checked').val()传递复选框的值,控制台日志显示为'undefined'。这是因为.prop()函数吗?如何获取选中复选框的值? 如果你需要更多的信息,我很乐意提供。这里有

  • 我试图创建一个表单,该表单顶部有一个复选框,当用户选中该复选框时,它会选择其他特定的复选框,但不是所有复选框。我很难通过反复试验或搜索找到答案。我唯一能找到的就是“全选”选项。不是我想要的。 理想情况下,当用户选中“管理包”旁边的复选框时,我想要“Chrome外观组”和“远程启动” 下面是代码和我在这方面的基本尝试,但它不起作用。提前谢谢。 超文本标记语言: Javascript 我不知道这个Ja

  • 我正在使用DefaultTableModel,如下所示: 现在我想在“Selected”列中仅使一个复选框可选。这怎么能做到。我也试过下面的方法,但它不起作用。

  • 我对Nattable是新的。我已经彻底的NatTable例子和它的源代码,但没有得到一个解决我的问题。在NatTable中,我有一个列,它应该提供一个复选框,根据另一列的值进行选择。我使用过Checkboxpainter、checkboxcelleditor、defaultbooleanconverter和IEDitableRule。这将呈现一个复选框,而不管单元格是否可编辑,尽管它允许我仅在启用

  • < br >我有这段代码,其中我设计了一个< code >可编辑的JComboBox来侦听我的< code>keyPressed事件,并显示一条消息,说明键已被按下。但我不知道为什么这没用。作为初学者,我可能在逻辑上/概念上犯了错误。 因此,我想征求关于如何构建代码的建议,以使其工作。 密码