2016-03-22 2 views
1

J'utilise les grilles JIDE pour charger d'énormes tables de données dans un format convivial. Ma principale raison d'utiliser la grille JIDE était d'avoir une capacité de filtrage et de tri. Il existe des filtres/trieurs disponibles sur le marché qui peuvent être accrochés avec des anciens et qui sont plus faciles à configurer, mais la plupart sont triés lexicalement plutôt que numériquement. Je crois que cela est dû à la classe de données sous-jacente de Matlab. Jusqu'à présent, le filtrage intégré de JIDE fonctionne bien et les charges sont encore plus rapides que les anciennes versions de Matlab quand je charge près de 500x35 de type de données mixtes. Mais il y a quelques autres choses que je voudrais configurer, auxquelles je n'ai trouvé aucun référent dans la documentation de JIDE.Comment personnaliser les grilles JIDE dans Matlab


1) Est-ce que quelqu'un sait comment ajouter une colonne de numéro de ligne dans l'implémentation de JIDE? (Tout comme l'en-tête du numéro de ligne dans les configurations anciennes/nouvelles). J'ai essayé d'utiliser findobj et d'inspecter (par Yair Altman) utilitaire pour les trouver et les allumer mais ils semblent être complètement manquant. Ou je manque quelque chose! JIDE Implementation Would like to see similar row headers as in old uitable

2) Lorsque nous choisissons « filtre personnalisé » dans le menu déroulant de la colonne et la sélection « est » ou « ne correspond pas à » ou « est supérieur à » il montre un onglet de sélection de date, comment pouvons-nous supprimer ce languette. Si ce n'est pas possible ou difficile, comment puis-je supprimer ces options? enter image description here


3) Enfin, Comment puis-je définir le nombre de décimales affichées dans la grille?


Code pour reproduire les problèmes.

% calling old uitable for performance reasons 
f1=figure; 
[h_Old,containter] = uitable('v0','data',magic(5),'ColumnNames',{'A','B',... 
    'C','D','E'},'Position',[5 5 500 400],'Parent',f1); 
set(h_Old,'Units','normalized','Editable',false); 

% Anotherway: JIDE grids even faster in setting up uitable with huge data 
data=num2cell(magic(5)); 
jtable=com.jidesoft.grid.SortableTable(data,{'A','B','C','D','E'}); 
theader = com.jidesoft.grid.AutoFilterTableHeader(jtable); 
theader.setAutoFilterEnabled(true) 
theader.setShowFilterName(true) 
theader.setShowFilterIcon(true) 
jtable.setTableHeader(theader) 
jscroll = javax.swing.JScrollPane(jtable); 
f2=figure; 
[h_old_2,container_2] = javacomponent(jscroll,[5,5,500,400],f2) 
set(container_2,'Units','norm'); 

Merci de votre temps et de votre aide. Répondre à l'avantage de l'autre qui pourrait faire face au même problème.

Répondre

1

1) JIDE n'a pas d'en-tête de ligne automatiquement. Cela peut être fait via TableScrollPane qui est malheureusement beaucoup plus compliqué. Une solution de contournement simple consiste à définir la première colonne comme en-tête de ligne et à lui donner une apparence d'un en-tête de ligne en apportant des modifications à DefaultTableCellRenderer. Code ci-dessous. Je suppose que c'est facile à maintenir à long terme.

% Making changes to DefaultTableCellRenderer 
% Give first column a header look, Center data 
cr0 = javax.swing.table.DefaultTableCellRenderer(); 
cr0.setHorizontalAlignment(0) % 0 for CENTER, 2 for LEFT and 4 for RIGHT 
cr0.setBackground(java.awt.Color(15790320)); % grey backgroundt 
jtable.getColumnModel.getColumn(0).setCellRenderer(cr0); 
jtable.getColumnModel.getColumn(0).setResizable(false); 
jtable.getColumnModel.getColumn(0).setMaxWidth(32); 

2) Ceci peut être fait en définissant la classe de colonnes jtable. Toujours en cours. Mettra à jour ma réponse bientôt.

3) Les décimales peuvent être définies en écrivant une extension simple à DefautTableCellRenderer en Java. Compilez ceci pour obtenir une classe> javaaddpath à cette classe dans matlab> remplacez DefaultTableCellRenderer par votre TableCellRenderer. Un échantillon de classe Java est ci-dessous:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.table.*; 
import java.text.DecimalFormat; 
public class CustomCellRenderer extends DefaultTableCellRenderer implements TableCellRenderer 
{ 
    public Component getTableCellRendererComponent 
      (JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
    { 
     JComponent cell = (JComponent) super.getTableCellRendererComponent 
       (table, value, isSelected, hasFocus, row, column); 
     // set color 
     cell.setBackground(new Color(0xC8C8C8)); 
     cell.setForeground(new Color(0xFFFFFF)); 

     //set Alignment 
     ((JLabel)cell).setHorizontalAlignment(SwingConstants.CENTER); 

     //set selection colors 
     if (isSelected){ 
      cell.setBackground(new Color(0x3399FF)); 
      cell.setForeground(new Color(0x000000)); // AM 
     }else{ 
      // set decimals 
      DecimalFormat DecimalFormatter = new DecimalFormat("#.00"); 
      value = DecimalFormatter.format(value); 
      return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
     } 
    return cell; 
    } 

} 

Ajouter cette classe à Matlab et remplacer remplacer DefaultTableCellRenderer avec votre TableCellRenderer comme ça.

data = {8.252,1.528,6.2598; 3.258,5.548,7.698; 4.448,9.5454,2.5644}; 
cols = {'A','B','C'} 
DTM=javax.swing.table.DefaultTableModel(data,cols); 
jtable = com.jidesoft.grid.SortableTable(); 
jtable.setModel(DTM); 
jscroll = javax.swing.JScrollPane(jtable); 
[htable,container] = javacomponent(jscroll,[5,5,500,400]); 
set(container,'Units','norm'); 
javaaddpath('\ExternalSources\JavaExtenstions\CustomCellRenderer'); 
cr=CustomCellRenderer(); 
for i=0:2, jtable.getColumnModel.getColumn(i).setCellRenderer(cr), end; 
jtable.repaint; 

Espérons que cela aidera d'autres personnes faisant face au même problème.