วิธีทำให้ JTable ไม่สามารถแก้ไขได้


97

จะทำให้JTableไม่สามารถแก้ไขได้อย่างไร? ฉันไม่ต้องการให้ผู้ใช้ของฉันสามารถแก้ไขค่าในเซลล์ได้โดยดับเบิลคลิกที่ค่าเหล่านั้น


มีคำตอบที่ดีกว่ามากที่นี่: stackoverflow.com/questions/9919230/disable-user-edit-in-jtable
Paul

คำตอบ:


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

แม้ว่าวิธีการที่คุณระบุจะใช้งานได้ แต่ก็ไม่มีเมธอดเช่น isEditable ใน AbstractTableModel สิ่งที่มีอยู่คือเมธอด isCellEditable (int, int) ซึ่งใช้ rowIndex และ coulmnIndex เป็นพารามิเตอร์ ผู้ใช้สามารถเลือกเปิด / ปิดการแก้ไขสำหรับแถว / คอลัมน์เฉพาะได้โดยการแทนที่เมธอด "isCellEditable" หรือสามารถใช้การใช้งานเริ่มต้นเพื่อปิดใช้งานการแก้ไขสำหรับเซลล์ทั้งหมด
ผ้าปูโต๊ะ

151

คุณสามารถแทนที่เมธอด 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 แล้วมีบางอย่างผิดปกติในโค้ดของคุณ - ตารางไม่เคยหายไปเพียงเพราะโมเดลของตารางไม่สามารถแก้ไขได้ ...
kleopatra

1
@DougHauf ดูเหมือนว่าคุณไม่รู้จัก Java หรือภาษาใด ๆ ที่ดีเนื่องจากภาษาส่วนใหญ่ใช้ไวยากรณ์ ish เดียวกันสำหรับการดำเนินการบูลีน ... ซึ่งส่งคืนบูลีน ... ฉันขอแนะนำให้คุณไปหา Java พื้นฐานมาก กวดวิชาและเริ่มต้นจากจุดเริ่มต้น การพยายามกระโดดเข้าวงสวิงแบบนี้จะลงเอยด้วยการที่คุณเรียนรู้ทุกอย่างผิดพลาด
Searchengine27

1
@DougHauf == เป็นนามแฝงสำหรับฟังก์ชัน Equals ที่เปรียบเทียบวัตถุ (ทางด้านซ้ายและด้านขวา) และส่งคืนบูลีน ฉันคิดว่าคุณใช้คำสั่งนี้ถ้าสิ่งนั้นประเมินบูลีนและมักจะใช้กับนิพจน์ประเภทนี้เช่น if (a == b) ทำอะไรบางอย่าง ลองพิมพ์ a == b หรือกำหนดค่านี้ให้กับตัวแปรและทำความเข้าใจกับผลลัพธ์
nelson eldoro

1
การแก้ไขข้างต้นใช้ไม่ได้กับฉันเช่นกัน ทำให้คอลัมน์และองค์ประกอบข้อมูลของตารางหายไป ตารางของฉันสร้างด้วย table = new JTable (tempTable, columnNames); โดยที่ tempTable เป็น String [] [] และ Column Names คือ String [] ฉันเชื่อว่าปัญหาเกิดจาก DefaultTableModel ใหม่ () ไม่ระบุชื่อข้อมูลและคอลัมน์สำหรับโมเดลตาราง ฉันจะระบุสิ่งเหล่านั้นในแบบจำลองข้อมูลได้อย่างไร ฉันลอง table.setModel (tableModel (tempTable, columnNames)); แต่นั่นทำให้เกิดข้อผิดพลาด "ไม่พบสัญลักษณ์"
user1164199

51
table.setDefaultEditor(Object.class, null);

2
นี่คือคำตอบที่ดีและง่ายที่สุด แน่นอนคุณต้องตั้งค่าตัวแก้ไขเป็นโมฆะดังนั้นคุณจะไม่สามารถแก้ไขได้
LEMUEL ADANE

ใช้งานได้ดีกับการเลือกเพียงครั้งเดียว วิคคือความต้องการของฉัน
Wesos de Queso

นี่ควรเป็นคำตอบ!
KrishPrabakar

36

เพียงแค่เพิ่ม

table.setEnabled(false);

มันใช้ได้ดีสำหรับฉัน


1
จะดีมากถ้าคุณไม่ได้ใช้โมเดลตารางที่กำหนดเอง!
Kingsolmn

27
แต่คุณจะไม่สามารถเลือกเซลล์หรือแถวได้
tianz

3
สิ่งนี้จะมีลักษณะ "เป็นสีเทา" ใน L & F บางรายการ
stommestack

2
ที่ได้ผล ขอบคุณ. อย่างไรก็ตามฉันยังคงต้องการทราบว่าเหตุใดวิธีการแบบจำลองข้อมูลของเนลสันจึงทำให้คอลัมน์และองค์ประกอบข้อมูลของตารางหายไป
user1164199

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

โปรดอธิบายว่าเหตุใดจึงเป็น "การแฮ็กแบบสุ่มในสถานที่ที่ไม่เหมาะสม" ตามเอกสารsetDefaultEditor () : "ถ้าตัวแก้ไขเป็นโมฆะให้ลบตัวแก้ไขเริ่มต้นสำหรับคลาสคอลัมน์นี้"
freesoft

ใช่และกลับไปใช้ค่าเริ่มต้นสำหรับ Object ;-) ดังนั้นคุณจึงไม่ปิดการใช้งานการแก้ไขจริงๆ (โดยบังเอิญถ้าคอลัมน์ใดคอลัมน์หนึ่งเป็นประเภท Object) นอกจากนี้คุณยังไม่มีคอลัมน์ใด ๆ ที่อาจมีตัวแก้ไขที่กำหนดเอง มีเป็น API หมายความว่าจะต้องดำเนินการเพื่อ editability เซลล์ควบคุมและนั่นคือรูปแบบของ อย่างอื่นเป็นการแฮ็กและไม่เหมาะสม
kleopatra

ฉันเห็นประเด็นของคุณ แต่สิ่งที่ฉันเข้าใจจาก api ก็คือถ้าฉันสร้างตารางด้วยวิธีที่รวดเร็ว (ด้วย "new JTable (Vector, Vector)") ตารางจะมีตัวแก้ไขเริ่มต้นสำหรับคอลัมน์ทั้งหมด ดังนั้นถ้าฉันเรียกใช้ "table.setDefaultEditor (คอลัมน์ null)" ฉันจะลบตัวแก้ไขเริ่มต้นออกจากคอลัมน์ดังนั้นคอลัมน์จะไม่มีตัวแก้ไขใด ๆ และคอลัมน์จะไม่สามารถแก้ไขได้ มันจะเป็น?
freesoft

ฉันสร้างตารางแบบนั้นnew JTable(Vector, Vector)และได้ผลสำหรับฉัน ฉันไม่จำเป็นต้องมีตัวแก้ไขในเซลล์ดังนั้นคุณมีคะแนนของฉัน
Dani Sancas

3

ฉันใช้สิ่งนี้และได้ผล:มันง่ายมากและใช้งานได้ดี

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

2
การเลือกจะไม่สามารถทำได้
h3xStream

วิธีแก้ปัญหาที่ง่ายและดี
นุวรรณหัสกุลปิยะรัฐนา

คำถามเกี่ยวกับการแก้ไขไม่ได้เปิดใช้งาน เปิดใช้งานไม่ได้แก้จุดประสงค์
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.