2016-03-22 2 views
1

巨大なデータテーブルを適切なフォーマットで読み込むためにJIDEグリッドを使用しています。 JIDEグリッドを使用する主な理由は、フィルタリングと並べ替えの機能を持つことでした。古いuitableでフックすることができ、構成するのが簡単ですが、ほとんどの場合、数値的ではなく語彙的に並べ替えるフィルタ/ソートがあります。私はそれがMatlabの基礎となるデータクラスに起因すると信じています。MatlabでJIDEグリッドをカスタマイズする方法

これまでのところ、JIDEの組み込みフィルタリングはうまくいき、Matlabの古いバージョンのuitableよりも速くuitableなロードが混在データ型の500x35近くにロードされます。しかし、私が構成したいと思ういくつかのことがあります。JIDEのドキュメントには何も言及されていません。


1)誰かがJIDE実装で行番号の列を追加する方法を知っていますか? (古い/新しいuitable構成の行番号ヘッダーのように)。 findobjを使用して(Yair Altmanの)ユーティリティを調べてスイッチをオンにしようとしましたが、完全に欠落しているようです。何か不足しています。 JIDE Implementation Would like to see similar row headers as in old uitable

2)私たちは、列のドロップダウンメニューから「カスタムフィルタ」を選択し、選択「です」または「と等しくありません」またはそれは、日付の選択]タブを示して「よりも大きい」、どのように我々はこれを削除することができますタブ。それが不可能または困難な場合、どうすればこれらのオプションを削除できますか? enter image description here


3)最後に、私はグリッドに表示される小数点以下の桁数を設定できますか?


問題を再現するためのコード。

% 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'); 

ご協力いただきありがとうございます。

答えて

1

同じ問題に直面する可能性のある相手のために応答します。

1)JID​​Eには自動的に行ヘッダーがありません。 TableScrollPaneで行うことができますが、残念ながらもっと複雑です。簡単な回避策は、最初の列を行ヘッダーにして、DefaultTableCellRendererを変更して行ヘッダーの「ルックアンドフィール」を与えることです。以下のコード。私はこれが長期的には容易に維持できると思います。

% 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)これは、jtable列クラスを定義することによって実行できます。まだ進行中です。すぐに私の答えを更新します。

3)小数点以下の桁数は、JavaのDefautTableCellRendererに単純な拡張を書き込むことで設定できます。これをコンパイルして、matlabでこのクラスのjavaaddpathクラスを取得し、DefaultTableCellRendererをあなたのTableCellRendererに置き換えます。サンプルJavaクラスは以下の通りです:

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; 
    } 

} 

は、MATLABにこのクラスを追加して、このようなあなたのTableCellRendererをして​​DefaultTableCellRendererを置き換える置き換えます。

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; 

これは同じ問題に直面しています。

関連する問題