2012-04-08 11 views
8

तुम लोग मेरा आखिरी सवाल पर सही दिशा में बात मुझ में इतनी भयानक थे और मैं अपने मूल प्रश्न की तरह का ही विस्तार यहाँ हैं:कैसे सेल संपादन के बाद JTable सेल प्रतिपादन बनाए रखने के लिए

How to set a JTable column as String and sort as Double?

जैसा कि अब मेरे पास मेरे कस्टम सेल रेंडरर का उपयोग करके $###, ## 0.00 के रूप में स्वरूपित मेरा मूल्य कॉलम है, मैंने अब सेल के लिए एक JTextField Editor भी स्थापित किया है। सेल का संपादन ठीक काम करता है जब मूल्य अपडेट किया जाता है, मेरे कस्टम रेंडरर में सेट संख्या प्रारूप अब सेल को प्रारूपित नहीं करता है (मैं संपादन के बाद $ खो रहा हूं)। क्या यह रेंडरर डेटा के प्रारंभिक प्रदर्शन के बाद भी कोशिकाओं को प्रस्तुत नहीं करना चाहिए?

मैं कोई भाग्य के साथ निम्नलिखित का उपयोग करने की कोशिश की है:

((AbstractTableModel) table.getModel()).fireTableDataChanged(); 

मुझे उम्मीद थी कि इस कस्टम रेंडरर का उपयोग कर नए मूल्यों रेंडर करने के लिए दोबारा सत्यापित और कोशिकाओं से रंगना तालिका मजबूर होना पड़ा, लेकिन यह दुर्भाग्य काम नहीं किया ...

क्या मुझे कुछ याद आ रहा है ... जाहिर है, लेकिन क्या?

उत्तर

10

जब आपका संपादक निष्कर्ष निकाला जाता है, तो तालिका editingStopped() विधि getCellEditorValue() के माध्यम से नया मान एकत्र करती है और इसे मॉडल में setValueAt() पर उपयोग करती है। मॉडल, बदले में, fireTableCellUpdated() होना चाहिए, जो निर्धारित प्रस्तुतकर्ता को बुलाएगा। default को विस्तारित करना Number स्वरूपण को संभालने के लिए पर्याप्त होना चाहिए। अन्य मामलों में, आपके संपादक के उदाहरण के रूप में आपके प्रस्तुतकर्ता के उदाहरण का उपयोग करना सुविधाजनक हो सकता है; यह example एक सामान्य कार्यान्वयन दिखाता है।

अनुपूरक: यहां डिफ़ॉल्ट संपादक और रेंडरर कार्यान्वयन का उपयोग करके एक मूल उदाहरण है।

अनुपूरक: @mKorbel से सहायक टिप्पणियों के लिए धन्यवाद, मैंने संपादन के लिए सेल के पाठ का चयन करने के लिए उदाहरण अपडेट किया है, जैसा कि @ कैमिकर के लेख Table Select All Editor में वर्णित है।

RenderEditNumber

package overflow; 

import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.event.MouseEvent; 
import java.text.NumberFormat; 
import java.util.EventObject; 
import javax.swing.DefaultCellEditor; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.text.JTextComponent; 

/** @see http://stackoverflow.com/a/10067560/230513 */ 
public class RenderEditNumber extends JPanel { 

    private NumberFormat nf = NumberFormat.getCurrencyInstance(); 

    public RenderEditNumber() { 
     DefaultTableModel model = new DefaultTableModel(
      new String[]{"Amount"}, 0) { 

      @Override 
      public Class<?> getColumnClass(int columnIndex) { 
       return Double.class; 
      } 
     }; 
     for (int i = 0; i < 16; i++) { 
      model.addRow(new Object[]{Double.valueOf(i)}); 
     } 
     JTable table = new JTable(model) { 

      @Override // Always selectAll() 
      public boolean editCellAt(int row, int column, EventObject e) { 
       boolean result = super.editCellAt(row, column, e); 
       final Component editor = getEditorComponent(); 
       if (editor == null || !(editor instanceof JTextComponent)) { 
        return result; 
       } 
       if (e instanceof MouseEvent) { 
        EventQueue.invokeLater(new Runnable() { 

         @Override 
         public void run() { 
          ((JTextComponent) editor).selectAll(); 
         } 
        }); 
       } else { 
        ((JTextComponent) editor).selectAll(); 
       } 
       return result; 
      } 
     }; 
     table.setPreferredScrollableViewportSize(new Dimension(123, 123)); 
     table.setDefaultRenderer(Double.class, new CurrencyRenderer(nf)); 
     table.setDefaultEditor(Double.class, new CurrencyEditor(nf)); 
     this.add(new JScrollPane(table)); 
    } 

    private static class CurrencyRenderer extends DefaultTableCellRenderer { 

     private NumberFormat formatter; 

     public CurrencyRenderer(NumberFormat formatter) { 
      this.formatter = formatter; 
      this.setHorizontalAlignment(JLabel.RIGHT); 
     } 

     @Override 
     public void setValue(Object value) { 
      setText((value == null) ? "" : formatter.format(value)); 
     } 
    } 

    private static class CurrencyEditor extends DefaultCellEditor { 

     private NumberFormat formatter; 
     private JTextField textField; 

     public CurrencyEditor(NumberFormat formatter) { 
      super(new JTextField()); 
      this.formatter = formatter; 
      this.textField = (JTextField) this.getComponent(); 
      textField.setHorizontalAlignment(JTextField.RIGHT); 
      textField.setBorder(null); 
     } 

     @Override 
     public Object getCellEditorValue() { 
      try { 
       return new Double(textField.getText()); 
      } catch (NumberFormatException e) { 
       return Double.valueOf(0); 
      } 
     } 

     @Override 
     public Component getTableCellEditorComponent(JTable table, 
      Object value, boolean isSelected, int row, int column) { 
      textField.setText((value == null) 
       ? "" : formatter.format((Double) value)); 
      return textField; 
     } 
    } 

    private void display() { 
     JFrame f = new JFrame("RenderEditNumber"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new RenderEditNumber().display(); 
      } 
     }); 
    } 
} 
+0

+1 लेकिन मैंने देखा है कि ठीक से काम नहीं आप जोड़ने, हटाने या संपादित मूल्य है कि मौजूद चाहते हैं, तो पहले, संपादक रिटर्न 0.00 :-), मैं को देखने के लिए होगा ... – mKorbel

+0

अच्छा बिंदु। मैट्रिक्स इनपुट के लिए, संपादक जानबूझकर 'NumberFormatException' पर शून्य लौटाता है; रद्द करें रद्द करना() 'एक सामान्य विकल्प होगा। – trashgod

+0

यह JFormattedTextField या JSPinner के लिए सेलएडिटर के समान है, मुझे यकीन है कि रॉब को मिल गया है ..., आपको दस्तावेज़ वापस करना होगा, रोब आप कहां हैं :-) – mKorbel

संबंधित मुद्दे