Как настроить сетки JIDE в Matlab

Я использую сетки JIDE для загрузки огромных таблиц данных в удобном формате. Моей главной причиной использования сетки JIDE было наличие работающей фильтрации и сортировки. Существуют фильтры / сортировщики, которые можно подключить к старым, пригодным для использования и которые проще в настройке, но в большинстве случаев сортируются лексически, а не численно. Я считаю, что это связано с базовым классом данных Matlab.

Пока что встроенная фильтрация JIDE работает хорошо, и подходящая загрузка загружается даже быстрее, чем старая версия использования в Matlab, когда я загружаю около 500x35 смешанного типа данных. Но есть несколько других вещей, которые я хотел бы настроить, на которые я не нашел ссылок в документации JIDE.


1) Кто-нибудь знает, как добавить столбец номера строки в реализации JIDE? (так же, как заголовок номера строки в старых / новых подходящих конфигурациях). Я пытался использовать утилиту findobj и inspect (от Yair Altman), чтобы найти их и включить, но они, похоже, полностью отсутствуют. Или я что-то упустил! Реализация JIDE Хотелось бы видеть такие же заголовки строк, как в старых

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

Спасибо за ваше время и помощь.

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) Десятичные разряды можно установить, написав простое расширение для DefautTableCellRenderer в Java. Скомпилируйте это, чтобы получить класс> javaaddpath к этому классу в matlab > заменить 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;

Надеюсь, что это поможет другим, сталкивающимся с той же проблемой.

Другие вопросы по тегам