如何在 Matlab 中自定义 JIDE 网格
How to customise JIDE grids in Matlab
我正在使用 JIDE 网格以合适的格式加载大量数据表。我使用 JIDE 网格的主要原因是具有有效的过滤和排序功能。那里有 filter/sorters 可用,它们可以与旧的 uitable 挂钩并且更容易配置,但大多数排序是按词法而不是按数字排序。我相信这是由于 Matlab 的基础数据 class。
到目前为止,当我加载接近 500x35 的混合数据类型时,JIDE 的内置过滤运行良好,加载 uitable 的速度甚至比 Matlab 中旧版本的 uitable 更快。但是我还想配置一些其他的东西,但我在 JIDE 文档中找不到相关内容。
1) 有谁知道如何在JIDE 实现中添加行号列? (就像 old/new uitable 配置中的行号 header 一样)。我曾尝试使用 findobj 和 inspect(由 Yair Altman 提供)实用程序来找到它们并打开它们,但它们似乎完全 missing.Or 我遗漏了一些东西!
2) 当我们从列下拉列表中 select 'custom filter' 并选择 'is' 或“不等于”或 'is greater than' 时,它显示日期 selection 选项卡,我们如何删除此选项卡。如果那不可能或困难,我怎样才能删除这些选项?
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) JIDE 没有自动生成一行header。它可以通过 TableScrollPane 完成,不幸的是,它要复杂得多。一个简单的解决方法是将第一列作为行 header,并通过更改 DefaultTableCellRenderer 为其提供行 header 的 'Look and Feel'。下面的代码。我想这在很长的 运行 中很容易维护。
% 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 列 class 来完成。仍在进行中。很快就会更新我的答案。
3) 可以通过在Java 中对DefautTableCellRenderer 编写一个简单的扩展来设置小数位。编译它以获得 class > javaaddpath to this class in matlab > 用你的 TableCellRenderer 替换 DefaultTableCellRenderer。示例 Java Class 如下:
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;
}
}
将此 class 添加到 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;
希望这对面临同样问题的其他人有所帮助。
我正在使用 JIDE 网格以合适的格式加载大量数据表。我使用 JIDE 网格的主要原因是具有有效的过滤和排序功能。那里有 filter/sorters 可用,它们可以与旧的 uitable 挂钩并且更容易配置,但大多数排序是按词法而不是按数字排序。我相信这是由于 Matlab 的基础数据 class。
到目前为止,当我加载接近 500x35 的混合数据类型时,JIDE 的内置过滤运行良好,加载 uitable 的速度甚至比 Matlab 中旧版本的 uitable 更快。但是我还想配置一些其他的东西,但我在 JIDE 文档中找不到相关内容。
1) 有谁知道如何在JIDE 实现中添加行号列? (就像 old/new uitable 配置中的行号 header 一样)。我曾尝试使用 findobj 和 inspect(由 Yair Altman 提供)实用程序来找到它们并打开它们,但它们似乎完全 missing.Or 我遗漏了一些东西!
2) 当我们从列下拉列表中 select 'custom filter' 并选择 'is' 或“不等于”或 'is greater than' 时,它显示日期 selection 选项卡,我们如何删除此选项卡。如果那不可能或困难,我怎样才能删除这些选项?
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) JIDE 没有自动生成一行header。它可以通过 TableScrollPane 完成,不幸的是,它要复杂得多。一个简单的解决方法是将第一列作为行 header,并通过更改 DefaultTableCellRenderer 为其提供行 header 的 'Look and Feel'。下面的代码。我想这在很长的 运行 中很容易维护。
% 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 列 class 来完成。仍在进行中。很快就会更新我的答案。
3) 可以通过在Java 中对DefautTableCellRenderer 编写一个简单的扩展来设置小数位。编译它以获得 class > javaaddpath to this class in matlab > 用你的 TableCellRenderer 替换 DefaultTableCellRenderer。示例 Java Class 如下:
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;
}
}
将此 class 添加到 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;
希望这对面临同样问题的其他人有所帮助。