2

巨大なデータ テーブルを適切な形式でロードするために JIDE グリッドを使用しています。私が JIDE グリッドを使用した主な理由は、フィルター処理と並べ替え機能が機能することでした。古い uitable にフックでき、設定が簡単なフィルター/ソーターが利用可能ですが、ほとんどの場合、数値ではなく字句でソートされます。これは、Matlab の基になるデータ クラスによるものだと思います。

これまでのところ、JIDE の組み込みフィルタリングはうまく機能しており、500x35 近くの混合データ型をロードすると、Matlab の古いバージョンの uitable よりも高速にロードされます。しかし、設定したいことが他にもいくつかありますが、JIDE のドキュメントには参照先が見つかりませんでした。


1)JID​​E実装で行番号列を追加する方法を知っている人はいますか? (古い/新しい uitable 構成の行番号ヘッダーと同じように)。findobj と inspect (by Yair Altman) ユーティリティを使用してそれらを見つけてオンにしようとしましたが、それらが完全に欠落しているようです.または、何かが欠落しています!JIDEの実装 古い uitable と同様の行ヘッダーを見たい

2) 列のドロップダウンから [カスタム フィルター] を選択し、[等しい]、[等しくない]、または [より大きい] を選択すると、日付選択タブが表示されます。このタブを削除するにはどうすればよいですか。それが不可能または困難な場合、これらのオプションを削除するにはどうすればよいですか? ここに画像の説明を入力


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

お時間をいただきありがとうございます。

4

1 に答える 1

3

同じ問題に直面しているかもしれない他の人の利益のために答える。

1) JIDE は自動的に行ヘッダーを持ちません。残念ながら、もっと複雑な 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 に追加し、DefaultTableCellRenderer をこのように TableCellRenderer に置き換えます。

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;

これが同じ問題に直面している他の人に役立つことを願っています。

于 2016-04-02T11:47:36.937 に答える