1

このクラスは、6 つの列を持つ jtable を作成するためのもので、最後の列にはブール値のチェックボックスが含まれています。getColumnClass で指定しました。これらのボックスのチェックを外したりチェックしたりすることはできません。編集できません。クラス MyTableModel のメソッド setValueAt および getValueAt が正しくないのではないかと疑っていますが、理解できません。助けてください。ここでは 3 つのクラスを紹介します。main メソッドを持つ gui クラス、AbstractTableModel を拡張する MyTableModel、セル レンダラー クラス 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;
    }
}
4

2 に答える 2

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

私の理解が正しければ、0番目の列のみを編集可能に設定しようとしています。チェックボックスの列インデックスを追加して、true として返します。

于 2012-07-17T09:12:17.720 に答える
1

isCellEditable(int row, int col)anthoonが次のように言ったように変更してください:

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;   
  }
} 
于 2012-07-17T09:18:57.110 に答える