2013-02-26 31 views
5

में विस्तार करने में विफल रहता है मैंने इस तरह के अन्य प्रश्नों के लिए JTable/JComboBox प्रतिक्रियाओं के बहुमत के माध्यम से पढ़ा है, लेकिन अभी तक मेरी समस्या का समाधान नहीं मिला है।JComboBox JTable TableHeader

मैंने एक टेबल बनाया है जिसमें JComboBox TableHeader तत्व हैं। JComboBox तत्वों में से कोई भी आइटम की सूची प्रदर्शित करने के लिए खुल जाएगा। मैं व्यक्तिगत JComboBox तत्वों को प्रदर्शित करने के लिए आइटम सूचियां कैसे प्राप्त करूं?

कृपया ध्यान दें कि इस प्रश्न का एक विशिष्ट तत्व यह है कि JComboBox TableHeader में है, जो एक जेटीबल सेल के भीतर एम्बेडेड नहीं है।

किसी भी मदद की सराहना की जाती है।

SSCE

import java.awt.Component; 
import java.awt.Dimension; 
import java.util.Enumeration; 

import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.ListSelectionModel; 
import javax.swing.SwingUtilities; 
import javax.swing.table.TableCellRenderer; 
import javax.swing.table.TableColumn; 

public class ComboHeaderTest extends JScrollPane { 

private static final Dimension DEFAULT_SIZE = new Dimension(200, 200); 

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

     @Override 
     public void run() { 
      new ComboHeaderTest().initComponents(); 
     } 
    }); 
} 

private ComboHeaderTest() { 

    final String[][] data = { {"Header 1", "Header 2", "Header 3"}, 
           {"A", "B", "C"}, 
           {"D", "E", "F"}, 
           {"G", "H", "I"}}; 

    setViewportView(getTable(data)); 
    setPreferredSize(DEFAULT_SIZE); 
} 

private void initComponents() { 

    JFrame frame = new JFrame("ComboHeaderTest"); 
    frame.add(this); 
    frame.pack(); 
    frame.setVisible(true); 
} 

private JTable getTable(final String[][] data) { 
    final String[] items = data[0]; 

    final ComboHeaderRenderer[] columnHeaders = new ComboHeaderRenderer[items.length]; 
    for(int i = 0; items.length > i; ++i) { 
     columnHeaders[i] = new ComboHeaderRenderer(items); 
    } 

    final JTable table = new JTable(data, columnHeaders); 

    final Enumeration<TableColumn> tableEnum = table.getColumnModel().getColumns(); 
    for (int columnIndex = 0; tableEnum.hasMoreElements(); ++columnIndex) { 
     final TableColumn column = tableEnum.nextElement(); 

     final ComboHeaderRenderer combo = columnHeaders[columnIndex]; 
     column.setHeaderValue(combo.getItemAt(columnIndex)); 
     column.setHeaderRenderer(combo); 
    } 

    table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    table.setRowSelectionAllowed(true); 
    table.setColumnSelectionAllowed(false); 
    table.setCellSelectionEnabled(false); 
    table.setFillsViewportHeight(true); 

    table.setSize(DEFAULT_SIZE); 
    table.validate(); 

    return table; 
} 

private static class ComboHeaderRenderer extends JComboBox implements TableCellRenderer{ 
    public ComboHeaderRenderer(final String[] entries) { 
     for (int i = 0; entries.length > i; ++i) { 
      addItem(entries[i]); 
     } 
    } 

    @Override 
    public Component getTableCellRendererComponent(final JTable table, final Object value, 
      final boolean isSelected, final boolean hasFocus, final int row, final int column) { 
     setSelectedItem(value); 
     return this; 
    } 
} 
} 
+0

पहले कहा जा बिना एक SSCCE सहित के लिए +1। – mre

+0

असंबद्ध: ए) [setXXSize का उपयोग न करें] (http://stackoverflow.com/a/7229519/203657) बी) यदि आप इसका उपयोग करके एक ही लक्ष्य तक पहुंच सकते हैं तो एक JSomething का विस्तार न करें c) setSize या तो कोई प्रभाव नहीं है या आप कुछ मौलिक रूप से गलत कर रहे हैं (लेआउटमैनेजर का उपयोग न करके) – kleopatra

+1

@ क्लेओपेट्रा - जैसा कि आप सुझाव देते हैं, मैं विरासत पर संरचना को प्राथमिकता देता हूं। मैं यह पता लगाने के लिए एक परीक्षण बिस्तर के रूप में उपयोग कर रहा था कि JComboBox को प्रकट होने से क्या रोक रहा था, इसलिए कोई लेआउटमैनेजर नहीं था। बस एसएससीसीई में सरल रखने की कोशिश कर रहा है। – Todd

उत्तर

4

यह वास्तव में वास्तव में काम करता है के रूप में उम्मीद। मुझे लगता है कि सुराग TableCellRenderer है।

रेंडरर आमतौर पर गैर-इंटरैक्टिव घटक होते हैं। वे आम तौर पर सतह पर चित्रित घटक का "स्नैप-शॉट" होते हैं और आमतौर पर उपयोगकर्ता के साथ बातचीत करने का कोई तरीका नहीं होता है।

यह अपेक्षित व्यवहार है।

आदेश तालिका शीर्षक के संपादन योग्य कार्यक्षमता की आपूर्ति करने में, आप एक JTableHeader

अपने क्रियान्वयन की आपूर्ति कुछ विचार

+0

यह भी देखें [क्यू एंड ए] (http://stackoverflow.com/q/7137786/230513)। – trashgod

+0

@MadProgrammer - मेरे लिए यह स्पष्ट करने के लिए धन्यवाद। मैंने सोचा कि एक रेंडरर पूरी तरह से कार्यात्मक घटक प्रस्तुत करेगा, न केवल इसके दृश्य पहलुओं। – Todd

+0

@trashgod - मैंने पोस्ट करने से पहले उस आइटम को देखा था, लेकिन मैंने इसे तालिका कक्षों के आधार पर समाधान प्रदान करने के लिए व्याख्या की, हेडर नहीं, हालांकि मूल विषय हेडर के बारे में था। अब मैं देखता हूं कि मैं गलत था। धन्यवाद। – Todd

0

Here के लिए इस example पर एक नज़र डालें करने की आवश्यकता के लिए जा रहे एक उदाहरण है कि JTable TableHeader में JComboBox का उपयोग करता है।

अन्य प्रकार के घटकों के लिए आसान है, here देखें।

enter image description here