JTableを編集不可にする方法


回答:


22

を使用できますTableModel

次のようなクラスを定義します。

public class MyModel extends AbstractTableModel{
    //not necessary
}

実際にisCellEditable()falseデフォルトなので、省略してもかまいません。(参照:http : //docs.oracle.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html

次に、のsetModel()メソッドを使用しますJTable

JTable myTable = new JTable();
myTable.setModel(new MyModel());

1
public voidメソッドにブール値を返すことはできません。
Geo

1
また、方法は次のisCellEditable
Matt

指定したアプローチは機能しますが、AbstractTableModelにはisEditableのようなメソッドはありません。存在するのは、rowIndexおよびcoulmnIndexをパラメーターとして取るメソッドisCellEditable(int、int)です。ユーザーは、「isCellEditable」メソッドをオーバーライドして、特定の行/列の編集を選択的に有効または無効にするか、デフォルトの実装を使用してすべてのセルの編集を無効にすることができます。
sateesh

150

たとえば、メソッドisCellEditableをオーバーライドして、必要に応じて実装できます。

//instance table model
DefaultTableModel tableModel = new DefaultTableModel() {

    @Override
    public boolean isCellEditable(int row, int column) {
       //all cells false
       return false;
    }
};

table.setModel(tableModel);

または

//instance table model
DefaultTableModel tableModel = new DefaultTableModel() {

   @Override
   public boolean isCellEditable(int row, int column) {
       //Only the third column
       return column == 3;
   }
};

table.setModel(tableModel);

JTableが消えた場合の注意

これJTableを使用するときにあなたが消えている場合は、DefaultTableModel(Object[][] data, Object[] columnNames)代わりにコンストラクタを使用する必要があるためです。

//instance table model
DefaultTableModel tableModel = new DefaultTableModel(data, columnNames) {

    @Override
    public boolean isCellEditable(int row, int column) {
       //all cells false
       return false;
    }
};

table.setModel(tableModel);

3
これは、ダブルクリックイベントをJTableで正しく機能させるためのソリューションでもあります。ダブルクリックは通常、セルが編集モードになるときにセルによって消費されます。これにより、セルがそれを行わないようにし、代わりにダブルクリックをJTable自体に送信します。解決策をありがとう、ネルソン!
アンカーライト

2
その後、何かがあなたのコードで間違っ他の場所がある@Jop -テーブルは決して ...テーブルのモデルが編集できないという理由だけで消えない
クレオパトラ

1
@DougHauf Java、またはほとんどの言語はブール演算に同じような構文を使用しているため、実際にはどの言語も知らないようです...ブール値を返します...非常に基本的なJavaを見つけることをお勧めしますチュートリアルと最初から始めます。このようにブランコに飛び込もうとすると、すべてが間違って学習することになります。
searchengine27 2015

1
@DougHauf、==は、オブジェクトを(左側と右側で)比較してブール値を返すEquals関数のエイリアスです。ifがブール値を評価し、通常はこの種の式で使用されている場合、たとえばif(a == b)が何かを実行する場合、ステートメントを使用したと思います。a == bを印刷するか、これを変数に割り当てて結果を理解してください。
nelson eldoro 2015

1
上記の修正は私にとっても機能しません。これにより、テーブルの列とデータ要素が非表示になります。私のテーブルはtable = new JTable(tempTable、columnNames);で作成されます。tempTableはString [] []で、Column NamesはString []です。この問題は、新しいDefaultTableModel()がテーブルモデルのデータと列名を指定していないことが原因であると思います。データモデルでそれらを指定するにはどうすればよいですか。table.setModel(tableModel(tempTable、columnNames));を試しましたが、「シンボルが見つかりません」というエラーが発生します。
user1164199


36

追加するだけ

table.setEnabled(false);

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


1
これは、カスタムテーブルモデルを使用していない場合に最適です。
Kingsolmn 2012

26
ただし、セルまたは行を選択することはできません。
tianz 2013年

3
これは、一部のL&Fでは「グレー表示」になります。
stommestack 2013

2
うまくいきます。ありがとう。ただし、ネルソンのデータモデルメソッドによってテーブルの列とデータ要素が消える理由を知りたいのですが。
user1164199 2015

1
私にはうまくいきます!
Colby Cox

10

一連の値からTableModelを自動的に作成する場合( "new JTable(Vector、Vector)"を使用)、おそらく列からエディターを削除する方が簡単です。

JTable table = new JTable(my_rows, my_header);

for (int c = 0; c < table.getColumnCount(); c++)
{
    Class<?> col_class = table.getColumnClass(c);
    table.setDefaultEditor(col_class, null);        // remove editor
}

エディターがないと、データは編集できません。


4
-1不適切な場所でのランダムなハッキングは決して選択肢にはならない
kleopatra '27 / 01/14

それが「不適切な場所でのランダムなハッキング」である理由を説明できますか?setDefaultEditor()docによると:「エディターがnullの場合、この列クラスのデフォルトエディターを削除します。」
freesoft、2014年

そうです、Objectのデフォルトにフォールバックします;-)したがって、編集を実際に無効にしないでください(列の1つがObject型である場合に誤って)、カスタムエディターを持つ可能性のある列もすべて失われます。そこ制御セル編集可能に実装されることを意図APIは、それがモデルのです。その他はすべてハッキングであり、そのため不適切です。
クレオパトラ2014年

あなたの言ってる事がわかります。しかし、APIから理解したことは、高速な方法でテーブルを作成すると( "new JTable(Vector、Vector)"を使用)、テーブルにはすべての列のデフォルトエディターが含まれることになります。したがって、「table.setDefaultEditor(column、null)」を実行すると、列からデフォルトのエディターが削除されるため、列にエディターがなくなり、列を編集できなくなります。それはでしょうか?
freesoft、2014年

私はその方法new JTable(Vector, Vector)でテーブルを作成し、私のために働いていました。セルに編集者はいらないので、投票してください。
ダニSancas 14

3

私はこれを使用しましたが、うまくいきました。非常にシンプルで問題なく動作します。

JTable myTable = new JTable();
myTable.setEnabled(false);

2
選択はできません。
h3xStream 2017

シンプルで優れたソリューション
Nuwan Harshakumara Piyarathna

質問は編集可能について有効になっていないです。有効にしても目的が解決しない
shaILU

2

新しいDefaultCellEditorクラスを作成します。

public static class Editor_name extends DefaultCellEditor {
  public Editor_name(JCheckBox checkBox) {
   super(checkBox);
  }
  @Override
  public boolean isCellEditable(EventObject anEvent) {
    return false;
  }
}

そしてsetCellEditorを使用します:

JTable table = new JTable();
table.getColumn("columnName").setCellEditor(new Editor_name(new JCheckBox()));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.