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

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

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


1) Кто-нибудь знает, как добавить столбец с номером строки в реализации JIDE? (так же, как заголовок номера строки в старых/новых подходящих конфигурациях). Я пытался использовать утилиту findobj и inspect (от Яира Альтмана), чтобы найти их и включить, но они, кажется, полностью отсутствуют. Или я что-то упустил! Реализация 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');

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


person Amit    schedule 22.03.2016    source источник


Ответы (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;

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

person Amit    schedule 02.04.2016
comment
Я хотел удалить серый фон из моего заголовка. Этот совет Простой обходной путь — сделать первый столбец заголовком строки — это то, что я реализовал, и это выполнило свою работу. Спасибо и +1! - person Dev-iL; 17.11.2019