2016-03-24 24 views
0

JTree uygulayıp bazı verileri doldurdum. Tablo üç sütun içerir ve belirli bir hücrede bulunan bazı değerlere dayanarak etiketlere veya açılan kutulara sahip olmalıdır. 3. sütundaki tüm değerler düzenlenebilir. Bir düğümün seçildiği ve buna bağlı olarak bir JTree sahibim de buna göre tablo değerleri değişir. Tablodaki bir hücreyi düzenlediğimde ve ağacdaki başka bir düğüme (tablodaki yeni bir veri kümesi grubunu doldurduğunda) geçtiğimde sorun var, önceden düzenlenmiş hücre değerleri yeni hücre değerlerinin üstündeki tabloda var. Aşağıda, TableCellRenderer ve TableCellEditor'ı nasıl uyguladım. Bazı kavramları yanlış kullanmış olabilirim, çünkü ben salıncak için yeni bir başlangıç ​​yapıyorum. Lütfen yanlış yaptıklarımı bulmama yardım et. enter image description hereJTable hücreleri üst üste biniyor

cevap

3

masanın bir hücreyi düzenlemek ve (tablodaki verilerin bir dizi yeni doldurur) ağacındaki bir düğüme taşıdığınızda sorunu var

 public void populateTableData(List<Field> list,JTree jTree){ 
     fieldList = null; 
     tcBuilderTree = jTree; 
     fieldList = list; 
     md=new PropertiesTableModel(fieldList); 
     getPropertieseTable().setModel(md); 

     final TableCellRenderer cellRenderer = new TableCellRenderer() { 
      @Override 
      public Component getTableCellRendererComponent(JTable arg0, 
                  Object value, 
                  boolean isSelected, 
                  boolean hasFocus, 
                  int row, 
                  int col) { 

       if(value instanceof List<?>) { 
        List<Value> valueList=(ArrayList)value; 
        return createComboBox(valueList); 
       } 
       else{ 
        JLabel lbl=new JLabel(); 
        lbl.setText((String)value); 
        return lbl; 
       } 

      } 
     }; 
     propertiesTable.setDefaultRenderer(Object.class, cellRenderer); 

     final TableCellEditor cellEditor = new TableCellEditor() { 
      private DefaultCellEditor textEditor; 
      private DefaultCellEditor currentEditor; 
      @Override 
      public Component getTableCellEditorComponent(JTable table, 
                 Object value, 
                 boolean isSelected, 
                 int row, 
                 int column) { 
       textEditor = new DefaultCellEditor(new JTextField()); 
       PropertiesTableModel model = (PropertiesTableModel) table.getModel(); 
       List<Value> values = model.getPossibleValues(row, column); 
       if (values != null) { 
        List<Value> valueList=(ArrayList)value; 
        currentEditor = new DefaultCellEditor(createComboBox(valueList)); 
       } else { 
        currentEditor = textEditor; 
       } 
       return currentEditor.getTableCellEditorComponent(table, value, 
         isSelected, row, column); 
      } 

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

      @Override 
      public boolean isCellEditable(EventObject anEvent) { 
       JTable tbl = (JTable) anEvent.getSource(); 
       int row, col; 
       if (anEvent instanceof MouseEvent) { 
        MouseEvent evt = (MouseEvent) anEvent; 
        row = tbl.rowAtPoint(evt.getPoint()); 
        col = tbl.columnAtPoint(evt.getPoint()); 
       } else { 
        row = tbl.getSelectedRow(); 
        col = tbl.getSelectedColumn(); 
       } 
       if(col<2){ 
        return false; 
       } 
       else 
       { 
        return true; 
       } 
      } 

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

      @Override 
      public boolean stopCellEditing() { 
       Object obj = currentEditor.getCellEditorValue(); 
       fieldList.get(propertiesTable.getEditingRow()) 
               .setDefaultValue(obj); 
       return currentEditor.stopCellEditing(); 
      } 

      @Override 
      public void cancelCellEditing() { 
       currentEditor.cancelCellEditing(); 
      } 

      @Override 
      public void addCellEditorListener(CellEditorListener l) { 
      } 

      @Override 
      public void removeCellEditorListener(CellEditorListener l) { 

      } 
     }; 
     propertiesTable.setDefaultEditor(Object.class,cellEditor); 
    } 

, önceden düzenlenmiş hücre değerler yeni hücre değerlerinin üstünde tabloda bulunur.

Tabloyu yeni verilerle yeniden yüklemeden önce tablo hücresinin düzenlenmesini durdurmadığınız sanırım. Eğer JTable oluştururken

Muhtemelen kodu aşağıdaki eklemek gerekir:

JTable table = new JTable(...); 
table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); 

fazla bilgi için Table Stop Editing bakınız.

tablo üç sütun bulunur ve Bunu özel düzenleyicileri oluşturmak için gerek olmayabilir ya etiketleri veya birleşik giriş kutuları

olmalıdır belirli hücre üzerinde bazı değerlere dayalı. Sadece düzenlenmiş olan hücreye göre tabloyu uygun varsayılan düzenleyiciyi seçmesini sağlayın. JTable'ın getCellEditor(...) yöntemini geçersiz kılarak bunu yapabilirsiniz. Bu yaklaşımın bir örneği için How to add unique JComboBoxes to a column in a JTable (Java) göz atın.

+0

Hücre düzenlemesinin durdurulması sorunu çözmedi. Ben de nasıl göründüğüne dair bir resim ekledim. Görünüşte düzenlenmiş hücreler düzenlenebilir bir kontrol oluşturur, ancak kaybolmaz. – sher17

+0

@Sherihan Özel editörler ve oluşturucularınızdan kurtulduğunda ne oldu? – camickr

+0

Varsayılan düzenleyici seçeneğini kullanmayı denemedim. Bir hücreyi her güncellediğimde, yeni bir JTextField'ın yaratıldığını ve bunun sorunu olduğunu hissediyorum. Bunu halletmenin bir yolu var mı? – sher17

İlgili konular