JTable को गैर-संपादन योग्य कैसे बनाया जाए


97

JTableगैर-संपादन योग्य कैसे बनाएं ? मैं नहीं चाहता कि मेरे उपयोगकर्ता कोशिकाओं में मूल्यों को डबल-क्लिक करके संपादित कर सकें।


बहुत बेहतर उत्तर यहां उपलब्ध है: stackoverflow.com/questions/9919230/disable-user-edit-in-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 में मौजूद है। जो मौजूद है वह विधि है CCEditable (int, int) जो कि रोइंडेक्स और कूप्लमइंडेक्स को पैरामीटर के रूप में लेती है। उपयोगकर्ता किसी विशेष पंक्ति / स्तंभ के लिए "isCellEditable" विधि को ओवरराइड करके चुनिंदा रूप से सक्षम / अक्षम कर सकता है या सभी कक्षों के लिए संपादन को अक्षम करने के लिए डिफ़ॉल्ट कार्यान्वयन का उपयोग कर सकता है।
शतेश

150

आप विधि को ओवरराइड कर सकते हैं

//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
@ तब तक आपके कोड में कहीं और कुछ गलत है - एक टेबल कभी गायब नहीं होती है क्योंकि टेबल का मॉडल संपादन योग्य नहीं है ...
kleopatra

1
@DougHauf ऐसा प्रतीत होता है कि आप जावा, या वास्तव में किसी भी भाषा को नहीं जानते हैं, क्योंकि ज्यादातर भाषाएं बूलियन संचालन के लिए समान-ईश सिंटैक्स का उपयोग करती हैं ... जो एक बूलियन को वापस करती है ... मैं आपको एक बहुत ही मूल जावा खोजने की सलाह दूंगा ट्यूटोरियल और शुरुआत से शुरू करें। इस तरह से झूले में कूदने की कोशिश कर रहा है कि आप सब कुछ गलत सीख रहे हैं।
searchengine27

1
@DougHauf, == समान फ़ंक्शन के लिए एक उपनाम है जो वस्तुओं की तुलना (बाईं और दाईं ओर) करता है और एक बूलियन देता है। मुझे लगता है कि आपने कथन का उपयोग किया है यदि वह बूलियन का मूल्यांकन करता है और आमतौर पर इस तरह के भावों के साथ प्रयोग किया जाता है उदाहरण के लिए यदि (a == b) कुछ करते हैं। A == b मुद्रित करने का प्रयास करें या इसे केवल एक चर के लिए असाइन करें और परिणाम को समझें।
नेल्सन एल्डरो

1
उपरोक्त फिक्स मेरे लिए भी काम नहीं करता है। इससे तालिका का स्तंभ और डेटा तत्व गायब हो जाते हैं। मेरी तालिका तालिका = नए JTable (tempTable, columnNames) के साथ बनाई गई है;, जहाँ tempTable एक स्ट्रिंग है [] [] और कॉलम नाम एक स्ट्रिंग [] है। मेरा मानना ​​है कि समस्या नए DefaultTableModel () तालिका मॉडल के लिए डेटा और स्तंभ नामों को निर्दिष्ट नहीं करने के कारण होती है। मैं उन लोगों को डेटा मॉडल में कैसे निर्दिष्ट करूं। मैंने table.setModel (tableModel (tempTable, columnNames)) की कोशिश की;, लेकिन यह "प्रतीक नहीं ढूँढ सकता" त्रुटि का कारण बनता है।
user1164199

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

2
यह सबसे अच्छा और आसान उत्तर है। बेशक, आपको संपादक को अशक्त करने के लिए सेट करना होगा ताकि आप इसे संपादित नहीं कर पाएंगे।
लेमुएल अदनै

यह एकल चयन के साथ बहुत अच्छा काम करता है। विच मेरे लिए जरूरी था।
वेसो डी कुएसो

यह उत्तर होना चाहिए!
कृष्णप्रभाकर

36

बस जोड़ दो

table.setEnabled(false);

यह मेरे लिए ठीक काम करता है।


1
यदि आप एक कस्टम टेबल मॉडल का उपयोग नहीं कर रहे हैं तो यह बहुत अच्छा है!
Kingsolmn

26
लेकिन आप सेल या रो का चयन नहीं कर पाएंगे।
tianz

3
यह कुछ एलएंडएफ में "ग्रेयर्ड आउट" दिखेगा।
स्टॉम्स्टैक

2
यह काम करता है। धन्यवाद। हालाँकि, मैं अभी भी जानना चाहूंगा कि नेल्सन के डेटा मॉडल पद्धति के कारण तालिका का स्तंभ और डेटा तत्व कैसे गायब हो जाते हैं।
14:11 पर user1164199

1
मेरे लिए अच्छा काम करता है!
कोल्बी कॉक्स

10

यदि आप मानों के एक सेट से "नए जेटबल (वेक्टर, वेक्टर)" के साथ स्वचालित रूप से टेबलमॉडल बना रहे हैं, तो शायद स्तंभों से संपादकों को हटाना आसान है:

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 स्थानों पर यादृच्छिक हैकिंग है कभी नहीं एक विकल्प
Kleopatra

कृपया, क्या आप बता सकते हैं कि यह "अनुचित स्थानों पर यादृच्छिक हैकिंग" क्यों है? SetDefaultEditor () डॉक्टर के अनुसार : "यदि संपादक अशक्त है, तो इस वर्ग के लिए डिफ़ॉल्ट संपादक को हटा देता है।"
फ्रीसॉफ्ट

हाँ, और ऑब्जेक्ट के लिए डिफ़ॉल्ट पर वापस आ जाता है ;-) तो आप वास्तव में संपादन अक्षम नहीं करते हैं (बस गलती से यदि स्तंभों में से एक प्रकार ऑब्जेक्ट का है), तो भी आप किसी भी स्तंभ को याद कर रहे हैं जिसमें एक कस्टम संपादक हो सकता है। वहाँ है नियंत्रण सेल editability के लिए लागू किया जा करने के लिए होती एपीआई, और कहा कि मॉडल की है। बाकी सब कुछ हैकिंग और इस तरह के अनुचित के रूप में है।
क्लियोपेट्रा

में तुम्हारी बात समझ रहा हूँ। लेकिन मैं एपी से जो समझ रहा हूं वह यह है कि, अगर मैं फास्ट तरीके से एक टेबल बनाता हूं ("नया जेटबल (वेक्टर, वेक्टर)"), तो टेबल में इसके सभी कॉलम के लिए डिफ़ॉल्ट एडिटर होंगे। इसलिए, यदि मैं "table.setDefaultEditor (कॉलम, नल)" चलाता हूं, तो मैं कॉलम से डिफ़ॉल्ट संपादक को हटा दूंगा, इसलिए कॉलम में कोई संपादक नहीं होगा, और कॉलम संपादन योग्य नहीं होगा। क्या ये होगा?
फ्रीसॉफ्ट

मैंने उस तरह से तालिका बनाई new JTable(Vector, Vector)और मेरे लिए काम किया। मुझे किसी सेल में कोई संपादक नहीं चाहिए, इसलिए आपको मेरा वोट चाहिए।
दानी संक

3

मैंने इसका उपयोग किया और यह काम किया: यह बहुत सरल है और ठीक काम करता है।

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

2
चयन संभव नहीं होगा।
h3xStream

सरल और अच्छा समाधान
नुवान हर्षकुमार पियाराथन्ना

प्रश्न संपादन योग्य सक्षम नहीं है के बारे में है। सक्षम उद्देश्य को हल नहीं करता है
21

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()));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.