2012-08-08 21 views
10

मैं एक कस्टम तालिका प्रस्तुत करना और कस्टम सेल संपादक के साथ एक JTable बनाया है जो छवि में पैनल में दिखाया गया है परिणाम देता हैकस्टम JTable सेल संपादक और सेल रेंडरर

enter image description here

मैं बनाया का उपयोग कैसे करें जेपीनेल को विस्तारित करने वाली एक अलग कक्षा का उपयोग करते हुए पहली टेबल कोशिकाएं। और के रूप में तालिका मान जोड़ने,

 tbl.setCellEditor(new customCell()); 
     tbl.getColumnModel().getColumn(0).setCellRenderer(new customCell()); 

     DefaultTableModel dtm = (DefaultTableModel) tbl.getModel(); 

     Vector v = new Vector(); 
     v.add(new Panel()); 
     v.add("Test"); 
     dtm.addRow(v); 

     v.clear(); 
     v.add(new Panel()); 
     v.add("Test 2"); 
     dtm.addRow(v); 

और यह इस तालिका बनाने के लिए मेरी मेज कस्टम वर्ग है,

class customCell extends DefaultTableModel implements TableCellRenderer, TableCellEditor { 

     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
      Panel p = new Panel();    
      table.setRowHeight(row, p.getHeight()); 
      return p; 
     } 

     public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { 

      return new Panel(); 
     } 

     public Object getCellEditorValue() { 
      return ""; 
     } 

     public boolean isCellEditable(EventObject anEvent) { 
      throw new UnsupportedOperationException("Not supported yet."); 
     } 

     public boolean shouldSelectCell(EventObject anEvent) { 
      return true; 
     } 

     @Override 
     public boolean isCellEditable(int rowIndex, int columnIndex) { 
      return true; 
     } 

     public boolean stopCellEditing() { 
      return true; 
     } 

     public void cancelCellEditing() { 
      throw new UnsupportedOperationException("Not supported yet."); 
     } 

     public void addCellEditorListener(CellEditorListener l) { 
      throw new UnsupportedOperationException("Not supported yet."); 
     } 

     public void removeCellEditorListener(CellEditorListener l) { 
      throw new UnsupportedOperationException("Not supported yet."); 
     } 
    } 

मेरे समस्या माना जाता है पैनल के रूप में मैं मैं में टाइप नहीं कर सकते हैं उम्मीद दिखाया गया है टेक्स्ट फ़ील्ड या चेक बॉक्स बदलें या बटन पर क्लिक करें। कृपया मुझे बताएं कि इसे कैसे हल करें।

उत्तर

8

से इंटरफेस को लागू करने की AbstractCellEditor से शुरू करने के लिए पहले से ही दिखाई दे JPanel

के लिए उचित LayoutManager, Editable/non_Editable गुण जोड़ने के लिए आनंद लेने के

import java.awt.*; 
import java.awt.event.*; 
import java.util.EventObject; 
import javax.swing.*; 
import javax.swing.table.*; 

public class PanelInTable { 

    private JFrame frame; 
    private JTable compTable = null; 
    private PanelTableModel compModel = null; 
    private JButton addButton = null; 

    public static void main(String args[]) { 
     try { 
      UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"); 
      //UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } catch (Exception fail) { 
     } 
     SwingUtilities.invokeLater(() -> { 
      new PanelInTable().makeUI(); 
     }); 
    } 

    public void makeUI() { 
     compTable = CreateCompTable(); 
     JScrollPane CompTableScrollpane = new JScrollPane(compTable, 
       JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 
       JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); 
     JPanel bottomPanel = CreateBottomPanel(); 
     frame = new JFrame("Comp Table Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(CompTableScrollpane, BorderLayout.CENTER); 
     frame.add(bottomPanel, BorderLayout.SOUTH); 
     frame.setPreferredSize(new Dimension(800, 400)); 
     frame.setLocation(150, 150); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public JTable CreateCompTable() { 
     compModel = new PanelTableModel(); 
     compModel.addRow(); 
     JTable table = new JTable(compModel); 
     table.setRowHeight(new CompCellPanel().getPreferredSize().height); 
     table.setTableHeader(null); 
     PanelCellEditorRenderer PanelCellEditorRenderer = new PanelCellEditorRenderer(); 
     table.setDefaultRenderer(Object.class, PanelCellEditorRenderer); 
     table.setDefaultEditor(Object.class, PanelCellEditorRenderer); 
     return table; 
    } 

    public JPanel CreateBottomPanel() { 
     addButton = new JButton("Add Comp"); 
     addButton.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent ae) { 
       Object source = ae.getSource(); 
       if (source == addButton) { 
        compModel.addRow(); 
       } 
      } 
     }); 
     JPanel panel = new JPanel(new GridBagLayout()); 
     panel.add(addButton); 
     return panel; 
    } 
} 

class PanelCellEditorRenderer extends AbstractCellEditor implements 
     TableCellRenderer, TableCellEditor { 

    private static final long serialVersionUID = 1L; 
    private CompCellPanel renderer = new CompCellPanel(); 
    private CompCellPanel editor = new CompCellPanel(); 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, 
      boolean isSelected, boolean hasFocus, int row, int column) { 
     renderer.setComp((Comp) value); 
     return renderer; 
    } 

    @Override 
    public Component getTableCellEditorComponent(JTable table, Object value, 
      boolean isSelected, int row, int column) { 
     editor.setComp((Comp) value); 
     return editor; 
    } 

    @Override 
    public Object getCellEditorValue() { 
     return editor.getComp(); 
    } 

    @Override 
    public boolean isCellEditable(EventObject anEvent) { 
     return true; 
    } 

    @Override 
    public boolean shouldSelectCell(EventObject anEvent) { 
     return false; 
    } 
} 

class PanelTableModel extends DefaultTableModel { 

    private static final long serialVersionUID = 1L; 

    @Override 
    public int getColumnCount() { 
     return 1; 
    } 

    public void addRow() { 
     super.addRow(new Object[]{new Comp(0, 0, "", "")}); 
    } 
} 

class Comp { 

    public int type; 
    public int relation; 
    public String lower; 
    public String upper; 

    public Comp(int type, int relation, String lower, String upper) { 
     this.type = type; 
     this.relation = relation; 
     this.lower = lower; 
     this.upper = upper; 
    } 
} 

class CompCellPanel extends JPanel { 

    private static final long serialVersionUID = 1L; 
    private JLabel labelWith = new JLabel("With "); 
    private JComboBox typeCombo = new JComboBox(new Object[] 
    {"height", "length", "volume"}); 
    private JComboBox relationCombo = new JComboBox(new Object[] 
    {"above", "below", "between"}); 
    private JTextField lowerField = new JTextField(); 
    private JLabel labelAnd = new JLabel(" and "); 
    private JTextField upperField = new JTextField(); 
    private JButton removeButton = new JButton("remove"); 

    public CompCellPanel() { 
     setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); 
     relationCombo.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       enableUpper(relationCombo.getSelectedIndex() == 2); 
      } 
     }); 
     enableUpper(false); 
     removeButton.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       JTable table = (JTable) SwingUtilities.getAncestorOfClass(
         JTable.class, (Component) e.getSource()); 
       int row = table.getEditingRow(); 
       table.getCellEditor().stopCellEditing(); 
       ((DefaultTableModel) table.getModel()).removeRow(row); 
      } 
     }); 
     add(labelWith); 
     add(typeCombo); 
     add(relationCombo); 
     add(lowerField); 
     add(labelAnd); 
     add(upperField); 
     add(Box.createHorizontalStrut(100)); 
     add(removeButton); 
    } 

    private void enableUpper(boolean enable) { 
     labelAnd.setEnabled(enable); 
     upperField.setEnabled(enable); 
    } 

    public void setComp(Comp Comp) { 
     typeCombo.setSelectedIndex(Comp.type); 
     relationCombo.setSelectedIndex(Comp.relation); 
     lowerField.setText(Comp.lower); 
     upperField.setText(Comp.upper); 
     enableUpper(Comp.relation == 2); 
    } 

    public Comp getComp() { 
     return new Comp(typeCombo.getSelectedIndex(), 
       relationCombo.getSelectedIndex(), 
       lowerField.getText(), upperField.getText()); 
    } 
} 
+1

संपादन को रोकना संपादक में है, पैनल में नहीं। इसके अलावा, बाहरी कार्रवाई से मॉडल को गड़बड़ करना लिस्टनर है ... बहस योग्य ;-) – kleopatra

+0

महान पकड़ के लिए धन्यवाद, बीटीडब्ल्यू इस कोड को आपकी ईमानदारी से 3 बार से अधिक संशोधित किया गया है, मैंने कोशिश की और रोब द्वारा बनाई गई जेटीबल से एक्शन का उपयोग करने की कोशिश की (मुझे लगता है कि कुछ भी बेहतर, नि: शुल्क और सरल नहीं है), कोई बदलाव नहीं हुआ है और घटना को काफी समानता से निकाल दिया गया है, – mKorbel

+0

थैंक्स बहुत एमकेर्बेल – Harsha

12

मैं दृढ़ता से सुझाव है कि डिफ़ॉल्ट तालिका दाता और संपादकों में उपलब्ध कराया कार्यक्षमता पुन: उपयोग करने, के रूप में वहाँ बहुत सी बातें अपने कोड

  1. अपने संपादक, रेंडरर और टेबल मॉडल विभाजित कृपया के साथ गलत कर रहे हैं। उन्हें एक ही कक्षा में रखने के लिए बस अजीब
  2. अपने प्रस्तुतकर्ता के लिए, प्रत्येक बार Component के नए उदाहरण न बनाएं। इसके बजाय, एक ही घटक का पुन: उपयोग और बस getTableCellRendererComponent विधि
  3. ही में कि Component संशोधित संपादक Component
  4. बजाय UnsupportedOperationException रों साथ तरीकों को लागू करने के लिए या सिर्फ लौटने खाली String द्वारा एक डिफ़ॉल्ट संपादक बढ़ाएँ के लिए चला जाता है

Editors part in the JTable tutorial से बैक अप करने के लिए मेरे आगे बिंदु, एक छोटे से बोली:

क्या, ग आप एक पाठ क्षेत्र से एक संपादक अन्य निर्दिष्ट करने के लिए चाहते हैं, तो बिल्ली बॉक्स, या कॉम्बो बॉक्स? चूंकि DefaultCellEditor अन्य प्रकार के घटकों का समर्थन नहीं करता है, आपको थोड़ा और काम करना होगा। आपको एक क्लास बनाने की आवश्यकता है जो TableCellEditor इंटरफ़ेस लागू करता है। AbstractCellEditor वर्ग उपयोग करने के लिए एक अच्छा superclass है। यह TableCellEditor के superinterface, CellEditor को लागू करता है, जो आपको सेल संपादकों के लिए आवश्यक ईवेंट फ़ायरिंग कोड को लागू करने की समस्या को बचाता है।

आपके सेल संपादक वर्ग को कम से कम दो तरीकों को परिभाषित करने की आवश्यकता है - getCellEditorValue और getTableCellEditorComponent। सेलएडिटर द्वारा आवश्यक GetCellEditorValue विधि, सेल का वर्तमान मान देता है। TableCellEditor द्वारा आवश्यक GetTableCellEditorComponent विधि को उस घटक को कॉन्फ़िगर और वापस करना चाहिए जिसे आप संपादक के रूप में उपयोग करना चाहते हैं।

के रूप में स्पष्ट रूप से वहाँ समझाया आप घटना फायरिंग कोड को लागू करना चाहिए: आप घटना कोड फायरिंग सेल संपादकों के लिए आवश्यक को लागू करने की मुसीबत बचत

जिसे आपने स्पष्ट रूप से उपेक्षित किया था।इसलिए मेरी सलाह के बजाय खरोंच

+0

आप के साथ एक पूर्ण उदाहरण दे सकता है चलो कोड? – partho

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