【问题标题】:How to customise JIDE grids in Matlab如何在 Matlab 中自定义 JIDE 网格
【发布时间】:2016-07-09 07:31:11
【问题描述】:

我正在使用 JIDE 网格以合适的格式加载巨大的数据表。我使用 JIDE 网格的主要原因是有一个有效的过滤和排序能力。那里有可用的过滤器/分类器,它们可以与旧的 uitable 挂钩,并且更容易配置,但大多数是按词法而不是按数字排序。我相信这是由于 Matlab 的底层数据类。

到目前为止,当我加载接近 500x35 的混合数据类型时,JIDEs 内置过滤运行良好,并且 uitable 加载速度甚至比 Matlab 中的旧版本 uitable 更快。但是我还想配置一些其他的东西,我在 JIDE 文档中没有找到相关的内容。


1) 有谁知道如何在 JIDE 实现中添加行号列? (就像旧/新可用配置中的行号标题一样)。我曾尝试使用 findobj 和检查(通过 Yair Altman)实用程序来找到它们并打开它们,但它们似乎完全丢失了。或者我错过了一些东西!

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

感谢您的时间和帮助。

【问题讨论】:

    标签: java swing matlab matlab-uitable jide


    【解决方案1】:

    为了其他可能面临同样问题的人的利益而回答。

    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 > 用你的 TableCellRenderer 替换 DefaultTableCellRenderer。下面是一个示例 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;
    

    希望这可以帮助其他面临同样问题的人。

    【讨论】:

    • 我想从我的标题中删除灰色背景。这个技巧“一个简单的解决方法是将第一列作为行标题”是我最终实现的,它完成了工作。谢谢+1!
    猜你喜欢
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 2014-05-26
    • 2012-03-04
    • 2014-02-13
    • 1970-01-01
    相关资源
    最近更新 更多