2011-09-04 16 views
6

में डबल मानों को छंटनी मुझे इस से संबंधित कुछ प्रश्न मिले हैं लेकिन मुझे अपने मुद्दे पर एक आसान समाधान नहीं मिला है।जेटीबल

मुझे अपने जेटीबल प्रकार को डबल मान सही तरीके से बनाने का कोई तरीका नहीं मिल रहा है।

मैं AbstractTableModel बढ़ाया एक कक्षा सरणी प्राप्त करने और उचित प्रकार वापसी प्रति स्तंभ के लिए: अपने कस्टम JTable निर्माता में

class TableModelMod extends AbstractTableModel{ 

    private ArrayList data; 
    private String [] headers; 
    private Class [] types; 

    TableModelMod(String [] heads, ArrayList datas, Class [] classes){ 
     headers = heads; 
     data = datas; 
     types = classes; 
    } 
    ... 
    @Override public Class getColumnClass(int c){ 
     if (c > types.length - 1) 
      return null; 
     else 
      return types[c]; 
    } 
... 

और फिर:

TableRowSorter<TableModelMod> sorter = new TableRowSorter<TableModelMod>((TableModelMod)getModel()); 

लेकिन तब मैं जब जोड़ने यह त्रुटि प्राप्त पंक्तियां:

java.lang.IllegalArgumentException: Cannot format given Object as a Number 

यह DecimalFormat.format(Object number, StringBuffer toAppendTo, FieldPosition pos) विधि में विफल रहता है कि एसी सबसे संख्यात्मक प्रकार cepts लेकिन डबल।

यदि मैं डबल कॉलम के लिए एक और कक्षा का उपयोग करता हूं तो मुझे कोई त्रुटि नहीं मिलती है लेकिन फिर भी सॉर्टिंग अपेक्षा के अनुसार काम नहीं करती है। मैं अलग संख्यात्मक वर्गों के साथ करने की कोशिश की, लेकिन कोई भी सही ढंग से युगल सॉर्ट करने के लिए लग रहे हैं:

@Override public Class getColumnClass(int c){ 
    if (c > types.length - 1) 
     return null; 
    else if (types[c] == Double.class) 
     return Number.class; 
    else 
     return types[c]; 
} 

मुझे यकीन है कि अगर मैं मैं क्या जरूरत है एक कस्टम RowSorter, एक कस्टम कीजिए, या दोनों को लागू करने की है नहीं कर रहा हूँ।

क्या कोई मुझे इस सरल तरीके से ठीक करने के तरीके पर मार्गदर्शन कर सकता है?

धन्यवाद बहुत अच्छा और सबसे अच्छा संबंध है।

संपादित: हल

यह बताने के लिए जहां समस्या थी काफी शर्मनाक है।

ऑब्जेक्ट [] पंक्तियों वाली ऐरेलिस्ट को getObject (int) या getDouble (int) के बजाय getString (int) का उपयोग करके डेटाबेस परिणामसेट से भर दिया गया था, इसलिए मान को रेंडरर द्वारा डबल के रूप में उपयोग नहीं किया जा सका। यह अजीब बात है कि उसने कॉलम क्लास के रूप में इंटीजर या नंबर का उपयोग करके अपवाद नहीं दिए, लेकिन इसे स्ट्रिंग के रूप में क्रमबद्ध किया जा रहा था। मैं गलत वर्गों में एक मुद्दे की तलाश में था क्योंकि मुझे विश्वास था कि मेरे ऐरेलिस्ट में केवल ऑब्जेक्ट्स हैं।

धन्यवाद आपके उदाहरणों के लिए बहुत कुछ, मुझे देखकर मैंने देखा कि मेरे युगल वास्तव में स्ट्रिंग्स थे और फिर मुझे पता चला कि रूपांतरण कहां हो रहा था।

+1

आप अपने प्रश्न से समाधान को हटाने और एक जवाब के रूप में जोड़ना चाहिए। – murgatroid99

उत्तर

6

इस कोड को देखें। यह दोहरे मूल्यों की तरह है।

enter image description here

enter image description here

import java.awt.BorderLayout; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.RowSorter; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableModel; 
import javax.swing.table.TableRowSorter; 

public class RowSorterDemo { 
    public static void main(String args[]) { 
    JFrame frame = new JFrame("Sort Table Demo"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    Object rows[][] = { { "J", 23.1 }, { "R", 21.1, }, { "E", 21.2, }, { "B", 27.1, }, { "A", 25.2, }, 
     { "S", 22.9, }, }; 

    String columns[] = { "Name", "Age" }; 

    TableModel model = new DefaultTableModel(rows, columns) { 
     public Class getColumnClass(int column) { 
     Class returnValue; 
     if ((column >= 0) && (column < getColumnCount())) { 
      returnValue = getValueAt(0, column).getClass(); 
     } else { 
      returnValue = Object.class; 
     } 
     return returnValue; 
     } 
    }; 

    JTable table = new JTable(model); 

    RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model); 

    table.setRowSorter(sorter); 

    JScrollPane pane = new JScrollPane(table); 

    frame.add(pane, BorderLayout.CENTER); 

    frame.setSize(300, 150); 
    frame.setVisible(true); 
    } 
} 

मैं स्रोत इस link में दिए गए एक छोटा सा इतना है कि यह डबल मान लेता है संशोधित।

+0

क्या यह अभी भी काम करता है यदि आप स्पष्ट रूप से RowSorter सेट नहीं करते हैं?मुझे कभी भी सॉर्टर को मैन्युअल रूप से सेट नहीं करना पड़ा और सॉर्टिंग तब तक काम करता है जब तक 'getColumnClass() 'सही वर्ग देता है। – AngerClown

+0

यदि मैं स्पष्ट रूप से सेट नहीं करता हूं तो RowSorter तब होता है जब मैं शीर्षलेख पर क्लिक करता हूं। – AlbertCossi

+0

कोड के लिए बहुत बहुत धन्यवाद! – AlbertCossi

6

इस कोड को अपने SSCCE हो सकता है, तो आप कर सकते हैं demonstate आप इस कोड पर जारी, कोड से कुछ भी नहीं है कि आप कतरना तैनात

import java.util.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class TableTest2 { 

    public void initGUI() { 
     String[] columnNames = {"numbers","double", "text"}; 
     Object[][] data = {{1, 0.81, "A"}, {10, 5.268752005, "B"}, {7, 100.0,"C"},{6, 52.879999, "A"}, 
     {4, 62.50, "B"}, {2, 854.9999, "C"},{11, 19.01, "A"}, {100, 0.0009, "B"}, {20, 100.09, "C"}}; 
     JTable table = new JTable(new DefaultTableModel(data, columnNames) { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public java.lang.Class<?> getColumnClass(int c) { 
       return getValueAt(0, c).getClass(); 
      } 
     }); 
     table.setAutoCreateRowSorter(true); 
     table.getRowSorter().setSortKeys(Arrays.asList(new RowSorter.SortKey(0, SortOrder.ASCENDING))); 
     JFrame frame = new JFrame("LFIXimate"); 
     frame.setResizable(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new JScrollPane(table)); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

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

      @Override 
      public void run() { 
       new TableTest2().initGUI(); 
      } 
     }); 
    } 
} 
+0

धन्यवाद आपके कोड के लिए बहुत कुछ मैंने अपनी गलती मिलने से पहले परीक्षण किया था, यह सिर्फ ब्रैगबॉय थोड़ा स्पष्ट दिखता है, लेकिन वास्तव में, आपको बहुत धन्यवाद =) – AlbertCossi

+0

@mKorbel +1 अच्छा जवाब। हाय वापस। आपसे मिलकर अच्छा लगा। मैं इन दिनों शायद ही कभी सक्रिय हूं। अन्य सामानों के साथ बहुत व्यस्त :) – Boro

+0

+1 उदाहरण कम हो रहे हैं - gooood :-) SortKeys की कोई ज़रूरत नहीं है, हालांकि: getRowSorter()। ToggleSortOrder (0) प्रारंभिक सॉर्टिंग करेगा – kleopatra

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