1

JTable に次のセル モデルを使用しています。

this.setModel(new DefaultTableModel
    (
    new Object [][] {
    {"Item ID", ""},
    {"Radius", 0},
    {"Center", 0,0},
    {"Mass", 0}
    },
    new String [] 
    {
        "Property", "Value"
    }
    ) 
{
    Class[] types = new Class [] 
    {
        String.class, Object.class
    };
    boolean[] canEdit = new boolean [] 
    {
        false, true
    };

    @Override
    public Class getColumnClass(int columnIndex) 
    {
        return types [columnIndex];
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) 
    {
        return canEdit [columnIndex];
    }
});

ただし、これにより、行と列全体が編集可能/編集不可に設定されます。個々のセル (1,1) を編集不可として設定するにはどうすればよいですか?

4

4 に答える 4

2

個々のセル (1,1) を編集不可として設定するにはどうすればよいですか?

渡された行と列のインデックスを使用するだけで

@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
  return !( rowIndex == 1 && columnIndex == 1 );
}
于 2013-09-13T22:08:40.347 に答える
1

問題は、isCellEditableメソッドが 1 次元配列を使用していることです (それが必要な場合は問題ありません)。

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) 
    {
        return canEdit [columnIndex];
    }

これは基本的に、指定されたすべてのセルに対して、column編集可能かどうかを示します。

個々のセルを編集可能/編集不可にしたい場合は、 と の組み合わせがrowセルcolumnを編集可能/編集不可にするかどうかを決定する必要があります。column

簡単な例で更新

これは概念の簡単な例です。個人的には、動的テーブル モデルでの管理が難しくなるため、これには 2D 配列を使用しません...

ここに画像の説明を入力

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;

public class TestTable {

    public static void main(String[] args) {
        new TestTable();
    }

    public TestTable() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }
                MyTableModel model = new MyTableModel();
                JTable table = new JTable(model);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class MyTableModel extends DefaultTableModel {

        public MyTableModel() {
            super(new Object[][]{
                {"Item ID", ""},
                {"Radius", 0},
                {"Center", 0},
                {"Mass", 0}
            }, new String[]{
                "Property", "Value"
            });
        }
        Class[] types = new Class[]{
            String.class, Object.class
        };
        boolean[][] canEdit = new boolean[][]{
            {false, false},
            {false, true},
            {true, true},
            {true, false},
        };

        @Override
        public Class getColumnClass(int columnIndex) {
            return types[columnIndex];
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return canEdit[rowIndex][columnIndex];
        }
    }
}
于 2013-09-13T22:23:41.367 に答える
0

セル (0,1) を編集不可にする isCellEditable 関数の私のバージョン:

@Override
    public boolean isCellEditable(int rowIndex, int columnIndex) 
    {
        if(columnIndex==0)
            return false;
        if(columnIndex==1 && rowIndex>=1)
            return true;
        else return false;
    }

いいえの場合は、条件付きリターンを使用するのが最善です。編集可能なセルの数が編集不可能なセルより大きいか、またはその逆で、セルが編集 - 編集不可のパターンに従います。それ以外の場合は、2D ブール配列を使用することをお勧めします。

于 2013-09-20T13:41:33.360 に答える
0

これは私にとってはうまくいきます。

public class MyDefaultTableModel extends    javax.swing.table.DefaultTableModel {

    public MyDefaultTableModel() { // constructor
        super( new Object [][] {
        {null, null, null, null, null, null},
        {null, null, null, null, null, null},
        {null, null, null, null, null, null},
        {null, null, null, null, null, null}
        },
        new String [] {
            "Folio", "Artículo", "Precio", "Descuento", "Total", "Entregar"
        });

    }


     Class[] types = new Class [] {
        java.lang.Object.class, java.lang.Object.class,     java.lang.Object.class,java.lang.Object.class, java.lang.Object.class,     java.lang.Boolean.class
    };

    @Override
    public Class getColumnClass(int columnIndex) {
        return types [columnIndex];
    }
    boolean[][] canEdit = new boolean[][]{
        {false, false, false, false, false, true},
        {false, false, false, false, false, true},
        {false, false, false, false, false, true},
        {false, false, false, false, false, true}
    };

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return canEdit[rowIndex][columnIndex];
    }

    public void setCellEditable(int row, int col, boolean value) {
        canEdit[row][col] = value; // set cell true/false
        this.fireTableCellUpdated(row, col);
    }
}

モデルを jtable に設定します。

jTable.setModel(new MyDefaultTableModel());

特定のセルを編集不可に設定します。

MyDefaultTableModel vlModelDtm = (MyDefaultTableModel) jTable.getModel();
vlModelDtm.setCellEditable(0, 5, false);
于 2015-11-20T19:14:58.243 に答える