दिलचस्प पोस्ट
एंड्रॉइड में एचटीएमएल टैग्स को पट्टी या पलायन कैसे करें PermGen अंतरिक्ष टॉमकैट में त्रुटि LINQ को एसक्यूएल अपवाद: इसमें लैनक्यू में एसक्यूएल कार्यान्वयन क्वेरी प्रचालकों को छोड़कर स्थानीय अनुक्रम का इस्तेमाल नहीं किया जा सकता है जावा स्प्रिंग बूट: कैसे मेरे app रूट ("/") index.html को मैप करने के लिए? Jquery मोबाइल में पृष्ठों को कैसे प्रारंभ करें? पेजिंग नहीं गोलीबारी $ Sce.trustAsHtml के भीतर प्रतिपादन निर्देश कैसे एक JAR फ़ाइल बनाने के लिए जिसमें DLL फ़ाइलें शामिल हैं? स्ट्रिंग संयोजन पर os.path.join का उपयोग क्यों करें? वैकल्पिक पैरामीटर के साथ ओवरलोड किए गए विधियों पर विरोधाभासी 'नया' कारण मेमोरी लीक का उपयोग क्यों करता है? Knockout.js कंटेनरलेस "foreach" <table> के साथ काम नहीं कर रहा है निर्वाचन क्षेत्र के पार्सर और निर्भरता पार्सर के बीच का अंतर JQuery HTML () बनाम internalHTML यह विवेक विंडोज फॉर्म में काम नहीं कर रहा है प्रोग्रामिंग सिद्धांत: एक भूलभुलैया को हल करें

सूचकांक की परवाह किए बिना हमेशा पिछली पंक्ति डिफ़ॉल्ट टेलिबल मॉडेल से हटा दी गई थी

मुझे कुछ समस्याएं आती हैं जब मैं जावा में तालिका से पंक्तियों को हटाने की कोशिश कर रहा हूं। विशेष रूप से, मैं DefaultTableModel उपयोग करता हूं, और जब मैं एक पंक्ति को हटाने की कोशिश कर रहा हूं, तो removeRow(int row) विधि का उपयोग करते हुए अंतिम पंक्ति निकाल दी जाती है, चाहे row क्या है उदाहरण के लिए, मान लें कि हमारे पास छह पंक्तियां हैं जब removeRow(0) गए removeRow(0) या removeRow(2) या removeRow(5) को कहा जाता है, तो आखिरी पंक्ति को हमेशा हटा दिया जाता है। कुछ पता है कि ऐसा क्यों हो रहा है?

धन्यवाद

—अद्यतन करें

जब जेटेल के किसी विशेष कक्ष को दबाया जाता है, तो संबंधित पंक्ति को हटा दिया जाना चाहिए।

  class TagsTableMA extends MouseAdapter { @Override public void mousePressed(MouseEvent e){ Point p = e.getPoint(); int row = tagsJT.rowAtPoint(p); int column = tagsJT.columnAtPoint(p); if (column == COLUMN_DELETE_TAG){ DocDialog docDialog = new DocDialog(parentMainJF, true, null, "Please confirm...", "Are you sure you want to delete the \"" + tagsJT.getValueAt(row, COLUMN_TAG_NAME) + "\" tag?", DocDialog.TYPE_YES_NO); docDialog.show(); int answer = docDialog.getAnswer(); if (answer == DocDialog.YES) model.removeRow(row); } } } 

— अपडेट नम्बर 2 यहां मेरे मुद्दे के साथ कुछ कोड है I मैंने कुछ सामान निकाल दिए हैं जो अप्रासंगिक हैं।

 import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class MainJF extends JFrame { public MainJF(){ this.add(createTagsTable()); setMinimumSize(new java.awt.Dimension(200,400)); } private JTable createTagsTable(){ String[] columnNames = {"", "Tag", "", "", ""}; Object[][] data = new Object[10][columnNames.length]; for (int i=0; i<data.length; i++){ data[i][COLUMN_CHECK] = false; data[i][COLUMN_TAG_NAME] = "Tag " + i; data[i][COLUMN_TAG_ID] = i; data[i][COLUMN_EDIT_TAG] = "edit"; data[i][COLUMN_DELETE_TAG] = "delete"; } model = new TagsSelectionTableModel(columnNames, data); tagsJT = new JTable(model); tagsJT.setRowSelectionAllowed(true); tagsJT.addMouseListener(new TagsTableMA()); return tagsJT; } class TagsSelectionTableModel extends DefaultTableModel{ public TagsSelectionTableModel(String[] columnNames, Object[][] data){ super(data, columnNames); this.columnNames = columnNames; this.data = data; } private String[] columnNames; private Object[][] data; @Override public Object getValueAt(int row, int col) { return data[row][col]; } } class TagsTableMA extends MouseAdapter{ @Override public void mousePressed(MouseEvent e){ Point p = e.getPoint(); int row = tagsJT.rowAtPoint(p); int column = tagsJT.columnAtPoint(p); if (column == COLUMN_DELETE_TAG){ int irow = tagsJT.convertRowIndexToView(row); model.removeRow(irow); } } } private JTable tagsJT; private TagsSelectionTableModel model; private static int COLUMN_CHECK = 0; private static int COLUMN_TAG_NAME = 1; private static int COLUMN_TAG_ID = 2; private static int COLUMN_EDIT_TAG = 3; private static int COLUMN_DELETE_TAG = 4; public static void main(String args[]) { new MainJF().setVisible(true); } } 

Solutions Collecting From Web of "सूचकांक की परवाह किए बिना हमेशा पिछली पंक्ति डिफ़ॉल्ट टेलिबल मॉडेल से हटा दी गई थी"

columnAtPoint() से प्राप्त की गई row को देखने के निर्देशांक में है, जबकि removeRow() मॉडल निर्देशांक मानता है। संबंधित ट्यूटोरियल अनुभाग से उद्धरण:

यह भेद तब तक कोई फर्क नहीं पड़ता जब तक कि आपकी देखी गई डेटा को क्रमबद्ध, फ़िल्टर करने या स्तंभों के उपयोगकर्ता हेरफेर से पुनर्व्यवस्थित नहीं किया गया है।

यदि हां, तो आपको convertRowIndexToModel() का उपयोग करना होगा, जिसे सॉर्टिंग और फ़िल्टरिंग के अंत के बारे में बताया गया है, जो सलाह देता है:

सॉर्टर का इस्तेमाल करते समय, हमेशा सेल निर्देशांक का अनुवाद करना याद रखें।

साथ ही, MouseAdapter बजाय ListSelectionListener का उपयोग करने पर विचार करें

परिशिष्ट: getValueAt() आपके कार्यान्वयन निर्माता को प्रदान की गई सरणी का उपयोग करना जारी रखा, जबकि मॉडल का डेटा वास्तव में मूल कार्यान्वयन में संग्रहीत किया गया था। यदि आपको वास्तव में मॉडल की डेटा संरचना पर और अधिक नियंत्रण की आवश्यकता है, तो ऐबर्टटेबल मॉडेल का विस्तार करें, जैसा कि यहां दिखाया गया है ।

 import java.awt.EventQueue; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; /** @see https://stackoverflow.com/a/11237205/230513 */ public class MainJF extends JFrame { private JTable tagsJT; private TagsSelectionTableModel model; private static int COLUMN_CHECK = 0; private static int COLUMN_TAG_NAME = 1; private static int COLUMN_TAG_ID = 2; private static int COLUMN_EDIT_TAG = 3; private static int COLUMN_DELETE_TAG = 4; public MainJF() { this.add(new JScrollPane(createTagsTable())); pack(); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); } private JTable createTagsTable() { String[] columnNames = {"0", "Tag", "2", "3", "4"}; Object[][] data = new Object[10][columnNames.length]; for (int i = 0; i < data.length; i++) { data[i][COLUMN_CHECK] = false; data[i][COLUMN_TAG_NAME] = "Tag " + i; data[i][COLUMN_TAG_ID] = i; data[i][COLUMN_EDIT_TAG] = "edit"; data[i][COLUMN_DELETE_TAG] = "delete"; } model = new TagsSelectionTableModel(columnNames, data); tagsJT = new JTable(model); tagsJT.setRowSelectionAllowed(true); tagsJT.addMouseListener(new TagsTableMA()); return tagsJT; } class TagsSelectionTableModel extends DefaultTableModel { public TagsSelectionTableModel(String[] columnNames, Object[][] data) { super(data, columnNames); } } class TagsTableMA extends MouseAdapter { @Override public void mousePressed(MouseEvent e) { Point p = e.getPoint(); int row = tagsJT.rowAtPoint(p); int col = tagsJT.columnAtPoint(p); if (col == COLUMN_DELETE_TAG) { model.removeRow(row); } } } public static void main(String args[]) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new MainJF().setVisible(true); } }); } } 

DefaultTableModel की removeRow(int) विधि के कोड को देखते हुए, यह स्पष्ट है कि यह बैकिंग Vector के इसी सूचकांक में पंक्ति सरणी निकाल देगा:

  public void removeRow(int row) { dataVector.removeElementAt(row); fireTableRowsDeleted(row, row); } 

(जावा 6 से)

मैं दो संभावनाओं के बारे में सोच सकता हूं:

  1. आपने DefaultTableModel बढ़ा दिया है और इस विधि के कार्यान्वयन को बदल दिया है। (मुझे संदेह है कि यह मामला है – आप शायद इस पर अपनी पोस्ट में स्वीकार करेंगे)

  2. आपके पास तालिका के लिए एक कस्टम रेंडरर है, जो सेल की पंक्ति अनुक्रमणिका के आधार पर सेल डेटा को पेंट करता है।