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메서드가 부울을 반환하도록 할 수 없습니다 .
지오

1
또한 방법은isCellEditable
매트

지정한 접근 방식이 작동하는 동안 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 자체로 보냅니다. 해결책에 감사드립니다, Nelson!
anchorite 2012 년

2
무언가 코드에서 잘못된 곳이 @Jop - 테이블은 결코 ... 테이블의 모델을 편집 할 수 없습니다해서 사라집니다
클레오 파트라

1
@DougHauf 대부분의 언어가 부울 연산에 동일한 구문을 사용하기 때문에 Java 또는 실제로 잘 모르는 언어를 모르는 것 같습니다 ... 부울을 반환합니다 ... 매우 기본적인 Java를 찾는 것이 좋습니다. 튜토리얼과 처음부터 시작합니다. 이렇게 스윙에 뛰어 들려고하면 모든 것을 잘못 배우게 될 것입니다.
searchengine27

1
@DougHauf, ==는 객체 (왼쪽과 오른쪽)를 비교하고 부울을 반환하는 Equals 함수의 별칭입니다. 부울을 평가하고 일반적으로 이러한 종류의 식과 함께 사용되는 경우 문을 사용했다고 가정합니다. 예를 들어 if (a == b) 무언가를 수행합니다. a == b를 인쇄하거나 변수에 할당하고 결과를 이해하십시오.
nelson eldoro

1
위의 수정은 나에게도 작동하지 않습니다. 테이블의 열과 데이터 요소가 사라집니다. 내 테이블은 table = new JTable (tempTable, columnNames);로 생성됩니다. 여기서 tempTable은 String [] []이고 Column Names는 String []입니다. 이 문제는 테이블 모델의 데이터 및 열 이름을 지정하지 않은 new DefaultTableModel ()로 인해 발생한다고 생각합니다. 데이터 모델에서 어떻게 지정합니까? table.setModel (tableModel (tempTable, columnNames)); 시도했지만 "기호를 찾을 수 없음"오류가 발생합니다.
user1164199 aug


36

그냥 추가

table.setEnabled(false);

그것은 나를 위해 잘 작동합니다.


1
맞춤 테이블 모델을 사용하지 않는 경우 유용합니다!
Kingsolmn

27
그러나 셀이나 행을 선택할 수 없습니다.
tianz 2013 년

3
이것은 일부 L & F에서 "회색으로"보일 것입니다.
stommestack

2
작동합니다. 감사. 그러나 nelson의 데이터 모델 방법으로 인해 테이블의 열과 데이터 요소가 사라지는 이유를 여전히 알고 싶습니다.
user1164199

1
나를 위해 잘 작동합니다!
콜비 콕스

10

값 집합 ( "new JTable (Vector, Vector)"사용)에서 TableModel을 자동으로 생성하는 경우 열에서 편집기를 제거하는 것이 더 쉬울 수 있습니다.

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 inappropriated 위치에서 무작위로 해킹하지 않았다 옵션
클레오 파트라

"부적절한 위치에서 무작위 해킹"이 된 이유를 설명해 주시겠습니까? setDefaultEditor () 문서 에 따르면 "editor가 null이면이 열 클래스에 대한 기본 편집기를 제거합니다."
freesoft 2014 년

예, Object ;-)의 기본값으로 돌아갑니다. 따라서 편집을 실제로 비활성화하지 않습니다 (우연히 열 중 하나가 Object 유형 인 경우). 또한 사용자 지정 편집기가있을 수있는 열이 누락됩니다. 가 이다 제어 셀 편집 기능을 구현하는 의미 API는, 그 모델의입니다. 다른 모든 것은 해킹이며 부적절합니다.
kleopatra 2014 년

너의 의도를 알 겠어. 하지만 API에서 이해 한 것은 빠른 방식으로 테이블을 생성하면 ( "new JTable (Vector, Vector)") 테이블에 모든 열에 대한 기본 편집기가 있다는 것입니다. 따라서 "table.setDefaultEditor (column, null)"를 실행하면 열에서 기본 편집기를 제거하여 열에 편집기가없고 열을 편집 할 수 없게됩니다. 그럴까요?
freesoft

나는 그런 식으로 테이블을 만들고 new JTable(Vector, Vector)나를 위해 일했습니다. 감방에 편집자가 필요하지 않으니 내 투표를하세요.
Dani Sancas 2014

3

나는 이것을 사용했고 그것은 효과가 있었다 : 그것은 매우 간단하고 잘 작동한다.

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

2
선택이 불가능합니다.
h3xStream jul.

간단하고 멋진 솔루션
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.